Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,093 changes: 532 additions & 561 deletions .i18n-state.json

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions changelog.d/fixes/ci-contribution-fixtures.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Stabilize the Codex usage throttle and credential-health regression fixtures with controlled timing and explicit background-probe readiness. Keep Codex fingerprint coverage aligned with optional native Responses fields and select the exact model in the provider-page browser test.
- Refresh the translated cooldown-wait documentation and remove the retired Mistral model from the translated user guides so strict documentation drift checks match the current release.
45 changes: 20 additions & 25 deletions docs/i18n/am/docs/architecture/RESILIENCE_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,19 +259,17 @@ UI: ክትትል → የማቀዝቀዣ አስተዳዳሪ (`src/app/(dashboard)

---

## 4. የኮታ-ካፍል ማመሳሰል ቁጥጥር (v3.8.36)
## 4. የኮታ-ማጋራት የመለዋወጫ መቆጣጠሪያ (v3.8.36)

የደንበኝነት ምዝገባ መለያዎች (GLM፣ MiniMax ወዘተ.) ብዙውን ጊዜ ~1–3 ብቻ በአንድ ጊዜ የሚከናወኑ ጥያቄዎችን ይቀበላሉ; ይህንን ማለፍ 429 ስህተቶችን እና ማቀዝቀዣዎችን ያስከትላል። ይህ ችግር በ**ኮታ-ካፍል** (`qtSd/…`) ኮምቦዎች ሥር በጣም ከባድ ነው፣ በዚያም ብዙ የAPI ቁልፎች አንድ የላይኛው ጅረት መለያ ይጋራሉ። ሦስት ሽፋኖች የጋራ መለያ ከጎርፍ ጋር እንዳይገጥም ይከላከላሉ።
የደንበኝነት ምዝገባ መለያዎች (GLM፣ MiniMax፣ ወዘተ.) ብዙ ጊዜ ~ 1-3 ተመሳሳይ ጥያቄዎችን ብቻ ይቀበላሉ፤ ከዚያ በላይ 429 ዎች እና ማቀዝቀዣዎችን ያስነሳል። ይህ ሥር የሰደደ ነው።** ኮታ-ማጋራት** (`qtSd/…`) ጥንብሮች፣ በርካታ API ቁልፎች አንድ የወራጅ መለያ የሚጋሩበት። ሶስት እርከኖች የጋራ መለያ እንዳይጥለቀለቅ ያደርጋሉ።

### የእያንዳንዱ ግንኙነት የማመሳሰል ገደብ (`max_concurrent`)
### በግንኙነት የተመጣጠነ ካፕ (`max_concurrent`)

እያንዳንዱ የአቅራቢ ግንኙነት የ`max_concurrent` ከፍተኛ ገደብ ማውጣት ይችላል
(`provider_connections.max_concurrent`፣ በግንኙነት ሞዳል / API / DB ውስጥ የሚዘጋጅ)።
ገደብ ከሌለ ባዶ ይተዉት። ይህ ከታች ያለውን የተከታታይነት ሽፋን የሚያንቀሳቅስ ብቸኛው መቆጣጠሪያ ነው — ወደ መለያው እውነተኛ ማመሳሰል ያስቀምጡት (ለምሳሌ GLM ~1፣ MiniMax ~2)።
እያንዳንዱ የአቅራቢዎች ግንኙነት የ `max_concurrent` ጣሪያ (`provider_connections.max_concurrent`, በግንኙነት ሞዳል ውስጥ የተቀመጠ / API / DB) ማወጅ ይችላል. ያለ ገደብ ባዶውን ይተዉት። ይህ — በታች ያለውን ተከታታይነት ያለው ንብርብር የሚያንቀሳቅሰው ነጠላ ቁልፍ ነው ወደ መለያው እውነተኛ መመሳሰል (ለምሳሌ GLM ~ 1፣ MiniMax ~ 2)።

### የእያንዳንዱ ሞዴል የማመሳሰል ገደቦች (`modelConcurrency`)
### በአንድ ሞዴል የተመጣጣኝ ካፕ (`modelConcurrency`)

ግንኙነቱ በተጨማሪም በ`rateLimitOverrides` ካርታው ውስጥ ትክክለኛ የእያንዳንዱ ሞዴል የማመሳሰል ገደቦችን ማውጣት ይችላል፦
ግንኙነት በተጨማሪም በ `rateLimitOverrides` ካርታው ውስጥ ትክክለኛ የአንድ ሞዴል ተጓዳኝ ጣሪያዎችን ማወጅ ይችላል።

```json
{
Expand All @@ -282,35 +280,32 @@ UI: ክትትል → የማቀዝቀዣ አስተዳዳሪ (`src/app/(dashboard)
}
```

በግንኙነት ሞዳል ውስጥ ያስቀምጡት (**የፍጥነት ገደብ ሽፋኖች → የእያንዳንዱ ሞዴል የማመሳሰል ገደቦች**፣ በእያንዳንዱ መስመር አንድ `model=cap`) ወይም በ`PATCH /api/providers/[id]` በተመሳሳይ JSON ቅርጽ። ዋና ትርጉሞች፦
በግንኙነት ሞዳል ውስጥ ያዋቅሩት (** የዋጋ ገደብ → Per-model concurrency capsን ይሽራል።** , አንድ `model=cap` በአንድ መስመር) ወይም በ `PATCH /api/providers/[id]` ተመሳሳይ JSON ቅርጽ. ቁልፍ ትርጉም፡

- **በግንኙነት ደረጃ vs በሞዴል ደረጃ፦** `maxConcurrent` የጋራ የግንኙነት-አቀፍ ከፍተኛ ገደብ ሆኖ ይቀጥላል። ሁለቱም ሲተገብሩ፣ ሁለቱም በርዎች በአንድ ውህድ በር ውስጥ በአቶሚክ ሁኔታ ይገኛሉ
(`global → provider → account → model`); ውጤታማው ባህሪ ከሚተገበሩት መካከል ጥብቁ ገደብ ነው።
- **ትክክለኛ የሞዴል-ቁልፍ ይዛመዳል፦** ቁልፉ ከመስወገጃ ፍታህ በኋላ ወደ አስፈጻሚው የሚተላለፍ የሞዴል ሕብረቁምፊ ነው — በተለምዶ ቀላሉ የላይኛው ጅረት የሞዴል መታወቂያ
(`glm-5`)፣ ሳይሆን የደንበኛ-ጎን `provider/model` ምህዳር (`zai/glm-5` ከ`glm-5` ጋር አይዛመድም)። እሴቶቹ አዎንታዊ-ኢንቲጀር የተዛማጅ-ጥያቄ ገደቦች ናቸው።
- **አካባቢያዊ ተራ መጠበቅ፣ ምንም ግኝት የለም፦** ተጨባጭ ጥያቄዎች በአካባቢው በአሁኑ ተራ/ጊዜ-ማብቂያ ትርጉሞች በተራ ይጠብቃሉ (የተለዩ `SEMAPHORE_TIMEOUT` /
`SEMAPHORE_QUEUE_FULL` የመግቢያ ስህተቶች)። OmniRoute የላይኛው ጅረት ፖሊሲ አያገኝም ወይም አይገምትም — ኦፔሬተሩ ያዘጋጀውን ትክክለኛ ገደብ ብቻ ያስከብራል። የሞላ የሞዴል በር አቅራቢውን ፈጽሞ አያሰናክልም እና ቋሚ የሞዴል መዝጊያ ፈጽሞ አይፈጥርም; የላይኛው ጅረት 429/ማቀዝቀዣ/fallback ባህሪ የስህተት መጨረሻ ድጋፍ ሆኖ ይቀጥላል።
- **በእያንዳንዱ ግንኙነት፣ በእያንዳንዱ ሂደት መስፈሪያ፦** ገደቦች በእያንዳንዱ የዳታቤዝ ግንኙነት የተከፋፈሉ ናቸው እና በማህደረ ትውስታ ውስጥ ይዘዋል፣ ስለዚህ ተመሳሳይ የላይኛው ጅረት የAPI ቁልፍ እንደገና የሚጠቀሙ ሁለት ግንኙነቶች እርስ በርስ አይቀናጁም።
- **ያልተዋቀረ ማለት ያልተለወጠ ማለት ነው፦** ካርታውን ማስተዋል (ወይም የዳሽቦርዱን መስክ ባዶ መተው) ምንም የሞዴል በር አይጨምርም። ምንም አጠቃላይ የአቅራቢ ገደብ ሳይገልጽ የምሳሌ ውቅረት፦
- **ግንኙነት-ሰፊ እና ሞዴል-ተኮር፡-** `maxConcurrent` የጋራ ግንኙነት-ሰፊ ጣሪያ ሆኖ ይቆያል። ሁለቱም ሲተገበሩ ሁለቱም በሮች በአቶሚክ የተገኙት በተመሳሳይ ድብልቅ በር (`global → provider → account → model`) ውስጥ ነው; ውጤታማ ባህሪ በጣም ጥብቅ የሚተገበር ገደብ ነው.
- **ትክክለኛው የሞዴል-ቁልፍ ግጥሚያ፡-** ቁልፉ ጥራት — ን ካስኬደ በኋላ ወደ ፈጻሚው የተላለፈው የሞዴል ሕብረቁምፊ በመደበኛነት ባዶ የላይኛው ሞዴል መታወቂያ (`glm-5`) እንጂ ደንበኛ-ጎን `provider/model` ተለዋጭ ስም አይደለም (`zai/glm-5` `glm-5` ጋር አይዛመድም)። እሴቶች አዎንታዊ-ኢንቲጀር በአንድ ጊዜ የሚጠየቁ ጣሪያዎች ናቸው።
- **የአካባቢ ወረፋ፣ ምንም ግኝት የለም፡** ከመጠን በላይ የጥያቄዎች ወረፋ ከነባሩ queue/timeout ትርጉም ጋር (የተተየቡ `SEMAPHORE_TIMEOUT` / `SEMAPHORE_QUEUE_FULL` የመግቢያ ስህተቶች)። OmniRoute የላይኛውን ተፋሰስ ፖሊሲ አያገኝም ወይም አይገምተውም — ኦፕሬተሩ ያዋቀራቸውን ትክክለኛ ጣሪያዎች ያስፈጽማል። የተሞላ የሞዴል በር አቅራቢውን ፈጽሞ አያሰናክልም እና ቋሚ የሞዴል መቆለፊያን ፈጽሞ አይፈጥርም; ወደላይ 429/cooldown/fallback ባህሪ ስህተቱ የኋላ ማቆሚያ ሆኖ ይቀራል።
- **በግንኙነት፣ በሂደት ወሰን፡** ካፕዎች በእያንዳንዱ የውሂብ ጎታ ግንኙነት እና በማህደረ ትውስታ ውስጥ የተያዙ ናቸው፣ ስለዚህ ሁለት ግንኙነቶች ተመሳሳይ የላይኛው API ቁልፍን እንደገና የሚጠቀሙት እርስ በርሳቸው አይጣመሩም።
- **ያልተዋቀረ ማለት ያልተለወጠ ማለት ነው፡-** ካርታውን መተው (ወይም የዳሽቦርድ መስኩን ባዶ መተው) ምንም የሞዴል በር አይጨምርም። የምሳሌ ውቅር ምንም አይነት ሁለንተናዊ አቅራቢ ገደብ ሳያረጋግጥ፡-

```text
glm-5=1
glm-4.7=3
```

### የኮታ-ካፍል ጥያቄ ተከታታይነት
### የኮታ-ማጋራት ጥያቄ ተከታታይነት

የኮታ-ካፍል መላኪያ አዎንታዊ `max_concurrent` የገለጸ ግንኙነትን ሲያግብር፣ ወደዚያ **መለያ** የሚሄዱ ተዛማጅ ጥያቄዎች በእያንዳንዱ ግንኙነት ሴማፎር (ቁልፍ `qsconn:<connectionId>`) በኩል ተከታታይ ይሆናሉ፦ ተጨባጭ ጥያቄዎች መለያውን ከማራገፍ ይልቅ **በተራ ውስጥ ይጠብቃሉ**። ይህ **fail-open** ነው — የሞላ ተራ ወይም ጊዜ-ማብቂያ ሊላክ የሚገባ ጥያቄን ከመካድ ይልቅ ያለ ቦታ ይቀጥላል። በ**ቅንብሮች → ጽናት → የኮታ-ካፍል የእያንዳንዱ ግንኙነት ማመሳሰል** ውስጥ ያብሩ/ያጥፉ
(`resilienceSettings.quotaShareConcurrencyLimit.enabled`፣ ነባሪ በርቷል)። የ`max_concurrent` ገደብ ከሌለ ባህሪው አይለወጥም።
የኮታ-ማጋራት መላኪያ አወንታዊ `max_concurrent` የሚያውጅ ግንኙነትን ሲያነጣጥረው ለዚያም በተመሳሳይ ጊዜ ይጠይቃል።** መለያ** ተከታታይ በሆነ የግንኙነት ሴማፎር (ቁልፍ `qsconn:<connectionId>`): ከመጠን በላይ ጥያቄዎች** ወረፋው ላይ ይጠብቁ** ሂሳቡን ከማጥለቅለቅ ይልቅ. ነው።** አልተሳካም-ክፍት** — የተሞላ ወረፋ ወይም ጊዜው ያለፈበት የሚላክ ጥያቄን ከመቼውም ጊዜ በላይ ያለ ማስገቢያ ይቀጥላል። ግባ** ቅንጅቶች → የመቋቋም ችሎታ → ኮታ-ማጋራት በግንኙነት ኮንፈረንስ** (`resilienceSettings.quotaShareConcurrencyLimit.enabled`፣ ነባሪ በርቷል)። ያለ `max_concurrent` ካፕ ባህሪው አልተለወጠም።

> የኮታ-ካፍል መስወገጃ በር (`selectQuotaShareTarget`፣ DRR + P2C) ራሱ
> fail-open ነው እና ወደ ገደቡ የደረሰ ግንኙነትን _ቅድሚያ መስጠትን_ ብቻ ያቆማል — በነጠላ-ግንኙነት ገንዳ ጥብቅ ገደብ ማድረግ አይችልም፣ ስለዚህ ጎርፉን በእውነት የሚያጠቃው ይህ ሴማፎር ነው።
> የኮታ መጋራት ማዞሪያ በር (`selectQuotaShareTarget`፣ DRR + P2C) በራሱ አልተሳካም እና የ at-cap ግንኙነት — ባለአንድ ማገናኛ ገንዳ ብቻ ሊገድበው አይችልም፣ስለዚህ ይህ ሴማፎር በትክክል ጎርፉን የያዘው ነው።

### ኮምቦ ማቀዝቀዣ-አዋቂ እንደገና ሙከራ
### ጥምር ማቀዝቀዝ-በማወቅ ድጋሚ ይሞክሩ

ለእያንዳንዱ የኮምቦ ስትራቴጂ (ሲነቃ)፣ ለአጭር ጊዜያዊ ማቀዝቀዣ 429 የሚያወጣ ጥያቄ 429 ከመመለስ ይልቅ ማቀዝቀዣውን ይጠብቃል እና እንደገና ይልካል — ይህ በባለ-ብዙ-ሞዴል ኮምቦዎች ላይ የGemini-ደረጃ TPM/RPM መስኮቶችን (~60ሰከንድ retry-after) ይሸፍናል፣ ለምሳሌ የ2-ሞዴል ኮምቦ ሁለቱም ዒላማዎች በእያንዳንዱ ሞዴል የፍጥነት ገደብ ሲመቱ። በ**ቅንብሮች → ጽናት** ውስጥ በ`comboCooldownWait` (`enabled`፣ `maxWaitMs`፣ `maxAttempts`፣ `budgetMs`) የሚወሰን። በ`quota_exhausted` (እስከ እኩለ ሌሊት ተቆልፏል) ወይም በማረጋገጫ/አልተገኘም ምክንያቶች ፈጽሞ አይጠብቅም።
ለእያንዳንዱ ጥምር ስትራተጂ ~ ሲነቃ) 429 SHORT TPM/RPM ማቀዝቀዣ የሚሆን ጥያቄ ይጠብቀዋል እና 429 — ከመመለስ ይልቅ በድጋሚ ይልካል። በ `comboCooldownWait` (`enabled`፣ `maxWaitMs`፣ `maxAttempts`፣ `budgetMs`) ውስጥ የታሰረ** ቅንብሮች → የመቋቋም** . በ `quota_exhausted` (እስከ እኩለ ሌሊት ተቆልፏል) ወይም auth/not-found ምክንያቶች ፈጽሞ አይጠብቅም.

ተመሳሳዩ በር ከመላክ በፊት ያለውን ሁኔታ (#16319) ይሸፍናል፦ የኮምቦው እያንዳንዱ ዒላማ ማንኛውም ሙከራ ከመድረጉ በፊት ሞዴሉ በአጭር ጊዜያዊ መቆለፊያ ውስጥ ስለሚቀመጥ ሲዝለል፣ የዜሮ-ሙከራ መንገዱ ቆለፉን በተመሳሳይ ገደቦች ሥር ይጠብቃል እና እንደገና ይልካል፣ ምልክት-አልባ `503 ALL_TARGETS_SKIPPED` ከመመለስ ይልቅ። መጠበቅ ሳይፈቀድ ሲቀር (ገደብ፣ ሙከራ ወይም በጀት ሲያልቅ፣ ወይም ባህሪው ሲጠፋ)፣ የመጨረሻው ምላሽ ወደ `429 rate_limit_error` ይሻረዋል ከቀዳሚው ጊዜያዊ ቆለፍ ማብቂያ `retry_after` / `reset_at` ጋር; የኮታ፣ የማረጋገጫ እና አልተገኘም ቆለፎች ምልክት-አልባውን 503 ያዝናሉ።
ጥምር በ `config.comboCooldownWaitEnabled: false` መርጦ መውጣት ይችላል። ቀጥተኛ `false` ብቻ እነዚህን የጋራ ጥምር ጥበቃዎች (ከድህረ መላኪያ ማቀዝቀዝ እና የቅድመ መላኪያ circuit-open/model-lock ይጠብቃል) እና የጥበቃ-በጀት ጊዜ ማብቂያ-ወለል ቅጥያቸውን ያሰናክላል። የጠፋ ወይም `true` ዓለም አቀፍ ፖሊሲን ይጠብቃል; `true` በአለምአቀፍ ደረጃ የአካል ጉዳተኛ መጠበቅን ማንቃት አይችልም። ግልጽ `targetTimeoutMs` አሁንም ያሸንፋል። ይህ መርጦ መውጣት የተለየውን ቤተኛ-ኮዴክስ ተራ-ፒን ቅድመ መላኪያ መጠበቅን አይለውጠውም።

ተመሳሳዩ በር የቅድመ መላኪያ መያዣን (#16319) ይሸፍናል፡ የትኛውም ሙከራ ከመደረጉ በፊት እያንዳንዱ የኮምቦ ኢላማ ሲዘለል ሞዴሉ በአጭር ጊዜያዊ መቆለፊያ ውስጥ ተቀምጧል፣ የዜሮ ሙከራ መንገዱ ፍንጭ የሌለው `503 ALL_TARGETS_SKIPPED` ከመመለስ ይልቅ በዛው ጣሪያ ስር መቆለፊያውን ይጠብቃል እና እንደገና ይልካል። ምንም መጠበቅ በማይፈቀድበት ጊዜ (ጣሪያ፣ ሙከራ ወይም በጀት ተሟጦ፣ ወይም ባህሪው ጠፍቷል)፣ የተርሚናል ምላሽ ከመጀመሪያ ጊዜ የመሸጋገሪያ መቆለፊያ ጊዜ ጀምሮ `retry_after` / `reset_at` ን ወደ `429 rate_limit_error` ያሻሽላል። ኮታ፣ ኦውት እና ያልተገኙ መቆለፊያዎች ፍንጭ-ያነሰ 503 ያስቀምጣሉ።

```text
#16319 · comboCooldownWait · pre-dispatch (attempts = 0)
Expand Down
Loading
Loading