# ๐ŸŒ OmniRoute Proxy Guide (แžแŸ’แž˜แŸ‚แžš) ๐ŸŒ **Languages:** ๐Ÿ‡บ๐Ÿ‡ธ [English](../../../../ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡น [am](../../../am/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฆ [ar](../../../ar/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฟ [az](../../../az/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฌ [bg](../../../bg/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฉ [bn](../../../bn/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฆ [bs](../../../bs/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡จ๐Ÿ‡ฟ [cs](../../../cs/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ฐ [da](../../../da/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ช [de](../../../de/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ท [el](../../../el/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡ธ [es](../../../es/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡ช [et](../../../et/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ท [fa](../../../fa/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ซ๐Ÿ‡ฎ [fi](../../../fi/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ซ๐Ÿ‡ท [fr](../../../fr/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ช [ga](../../../ga/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [gu](../../../gu/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ha](../../../ha/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฑ [he](../../../he/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [hi](../../../hi/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ญ๐Ÿ‡ท [hr](../../../hr/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ญ๐Ÿ‡บ [hu](../../../hu/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฒ [hy](../../../hy/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ [id](../../../id/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ig](../../../ig/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡น [it](../../../it/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฏ๐Ÿ‡ต [ja](../../../ja/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ช [ka](../../../ka/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [kn](../../../kn/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ท [ko](../../../ko/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡น [lt](../../../lt/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡ป [lv](../../../lv/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [ml](../../../ml/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [mr](../../../mr/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡พ [ms](../../../ms/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡น [mt](../../../mt/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฒ๐Ÿ‡ฒ [my](../../../my/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ต [ne](../../../ne/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฑ [nl](../../../nl/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ด [no](../../../no/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [or](../../../or/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [pa](../../../pa/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ญ [phi](../../../phi/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ฑ [pl](../../../pl/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡น [pt](../../../pt/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ท [pt-BR](../../../pt-BR/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡ด [ro](../../../ro/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡บ [ru](../../../ru/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฑ๐Ÿ‡ฐ [si](../../../si/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฐ [sk](../../../sk/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฎ [sl](../../../sl/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ท๐Ÿ‡ธ [sr](../../../sr/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ช [sv](../../../sv/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ช [sw](../../../sw/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [ta](../../../ta/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [te](../../../te/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ญ [th](../../../th/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ท [tr](../../../tr/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡บ๐Ÿ‡ฆ [uk-UA](../../../uk-UA/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ต๐Ÿ‡ฐ [ur](../../../ur/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡บ๐Ÿ‡ฟ [uz](../../../uz/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ป๐Ÿ‡ณ [vi](../../../vi/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [yo](../../../yo/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡จ๐Ÿ‡ณ [zh-CN](../../../zh-CN/docs/ops/PROXY_GUIDE.md) ยท ๐Ÿ‡น๐Ÿ‡ผ [zh-TW](../../../zh-TW/docs/ops/PROXY_GUIDE.md) --- > **แžšแŸ†แž›แž„แž€แžถแžšแž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹แžแžถแž˜แž—แžผแž˜แžทแžŸแžถแžŸแŸ’แžแŸ’แžš แž€แžถแžšแž–แžถแžšแžขแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŽแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ แž“แžทแž„แž”แž‰แŸ’แž‡แžผแž“แž…แžšแžถแž…แžšแžŽแŸ AI แžแžถแž˜แžšแž™แŸˆแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŽแžถแž˜แžฝแž™ โ€” แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž—แžถแž–แžŸแŸ’แž˜แžปแž‚แžŸแŸ’แž˜แžถแž‰แž€แŸ’แž“แžปแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แŸ”** OmniRoute แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž˜แžถแž“แž˜แžปแžแž„แžถแžšแž–แŸแž‰แž›แŸแž‰ แžŠแŸ‚แž›แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แž”แž‰แŸ’แž‡แžผแž“แž…แžšแžถแž…แžšแžŽแŸแž‘แŸ…แž€แžถแž“แŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ AI แžแžถแž„แž›แžพแžแžถแž˜แžšแž™แŸˆแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ HTTP, HTTPS แžฌ SOCKS5แŸ” แž˜แžทแž“แžแžถแžขแŸ’แž“แž€แžŸแŸ’แžแžทแžแž“แŸ…แž€แŸ’แž“แžปแž„แžแŸ†แž”แž“แŸ‹แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹ แžแŸ’แžšแžผแžœแž€แžถแžšแž”แž„แŸ’แžœแžทแž› IP แžฌแž…แž„แŸ‹แž”แžถแž“แž€แžถแžšแž€แŸ’แž›แŸ‚แž„แžŸแŸ’แž“แžถแž˜แž˜แŸ’แžšแžถแž˜แžŠแŸƒแžŠแŸ„แž™แžŸแž˜แŸ’แž„แžถแžแŸ‹แž‘แŸ โ€” แž˜แž‚แŸ’แž‚แžปแž‘แŸ’แž‘แŸแžŸแž€แŸแž“แŸแŸ‡แž‚แŸ’แžšแž”แžŠแžŽแŸ’แžแž”แŸ‹แž‚แŸ’แžšแž”แŸ‹แž™แŸ‰แžถแž„แŸ” --- ## แžแžถแžšแžถแž„แž˜แžถแžแžทแž€แžถ - [แž แŸแžแžปแžขแŸ’แžœแžธแžแŸ’แžšแžผแžœแž”แŸ’แžšแžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ?](#why-use-proxies) - [แž‘แžทแžŠแŸ’แž‹แž—แžถแž–แž‘แžผแž‘แŸ…แž“แŸƒแžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜](#architecture-overview) - [แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ 4 แž€แž˜แŸ’แžšแžทแž](#4-level-proxy-system) - [แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ (CRUD)](#proxy-registry-crud) - [แž‘แžธแž•แŸ’แžŸแžถแžšแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžฅแžแž‚แžทแžแžแŸ’แž›แŸƒ 1proxy](#1proxy-free-proxy-marketplace) - [แž€แžถแžšแž”แž„แŸ’แžœแžทแž›แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ](#proxy-rotation) - [แž€แžถแžšแž”แŸ’แžšแž†แžถแŸ†แž„แž€แžถแžšแžšแž€แžƒแžพแž‰ แž“แžทแž„แž—แžถแž–แžŸแž˜แŸ’แž„แžถแžแŸ‹](#anti-detection--stealth) - [แžšแž”แŸ€แž”แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแžถแž„แž›แžพ](#upstream-proxy-modes) - [แž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ UI](#dashboard-ui) - [แžฏแž€แžŸแžถแžšแž™แŸ„แž„ API](#api-reference) - [แžขแžแŸแžšแž”แžšแžทแžŸแŸ’แžแžถแž“](#environment-variables) - [แž€แžถแžšแžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถ](#troubleshooting) --- ## แž แŸแžแžปแžขแŸ’แžœแžธแžแŸ’แžšแžผแžœแž”แŸ’แžšแžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ? แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ AI แž‡แžถแž…แŸ’แžšแžพแž“แžŠแžถแž€แŸ‹แž€แž˜แŸ’แžšแžทแžแž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพแžแŸ†แž”แž“แŸ‹แž—แžผแž˜แžทแžŸแžถแžŸแŸ’แžแŸ’แžšแŸ” แžขแŸ’แž“แž€แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแž“แŸ…แž€แŸ’แž“แžปแž„ **แžšแžปแžŸแŸ’แžŸแŸŠแžธ แž…แžทแž“ แžขแŸŠแžธแžšแŸ‰แž„แŸ‹ แž‚แžปแž™แž”แžถ แžแžฝแž€แž‚แžธ** แž“แžทแž„แž”แŸ’แžšแž‘แŸแžŸแž•แŸ’แžŸแŸแž„แž‘แŸ€แž แž‡แžฝแž”แž”แŸ’แžšแž‘แŸ‡แž€แŸ†แž แžปแžŸแžŠแžผแž…แž‡แžถแŸ– ``` unsupported_country_region_territory ``` แž‘แŸ„แŸ‡แž”แžธแž‡แžถแž“แŸ…แž€แŸ’แžšแŸ…แžแŸ†แž”แž“แŸ‹แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹แž€แŸแžŠแŸ„แž™ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹แŸ– | แž€แžšแžŽแžธแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ | แžŸแŸแž…แž€แŸ’แžแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | ------------------------------------- | ---------------------------------------------------------------------- | | **แž€แžถแžšแžšแŸ†แž›แž„แž€แžถแžšแž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹แžแžถแž˜แž—แžผแž˜แžทแžŸแžถแžŸแŸ’แžแŸ’แžš** | แž…แžผแž›แž”แŸ’แžšแžพ OpenAI, Anthropic, Codex, Copilot แž–แžธแž”แŸ’แžšแž‘แŸแžŸแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹ | | **แž€แžถแžšแž”แž„แŸ’แžœแžทแž› IP** | แž…แŸ‚แž€แž…แžถแž™แžŸแŸ†แžŽแžพแž›แžพ IP แž‡แžถแž…แŸ’แžšแžพแž“ แžŠแžพแž˜แŸ’แž”แžธแž‡แŸ€แžŸแžœแžถแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžขแžแŸ’แžšแžถ | | **แžฏแž€แž‡แž“แž—แžถแž–** | แž›แžถแž€แŸ‹ IP แž–แžทแžแž”แŸ’แžšแžถแž€แžŠแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž–แžธแžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแžแžถแž„แž›แžพ | | **แž€แžถแžšแžขแž“แžปแž›แŸ„แž˜แžแžถแž˜แž”แž‘แž”แŸ’แž”แž‰แŸ’แž‰แžแŸ’แžแžท** | แž”แž‰แŸ’แž‡แžผแž“แž…แžšแžถแž…แžšแžŽแŸแžแžถแž˜แžšแž™แŸˆแžŠแŸ‚แž“แž™แžปแžแŸ’แžแžถแž’แžทแž€แžถแžšแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹ | | **แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แž** | แž€แŸ’แž›แŸ‚แž„แž’แŸ’แžœแžพแžŸแŸ†แžŽแžพแž–แžธแžแŸ†แž”แž“แŸ‹แž•แŸ’แžŸแŸแž„แŸ— | --- ## แž‘แžทแžŠแŸ’แž‹แž—แžถแž–แž‘แžผแž‘แŸ…แž“แŸƒแžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ OmniRoute โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ แž”แž‰แŸ’แž‡แžธ โ”‚ โ”‚ แžงแž”แž€แžšแžŽแŸแž”แž‰แŸ’แž‡แžผแž“ โ”‚ โ”‚ แž€แžถแžšแž‘แžถแž‰แž™แž€ โ”‚ โ”‚ โ”‚ โ”‚ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ โ”‚โ”€โ”€โ”€โ–ถโ”‚ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ โ”‚โ”€โ”€โ”€โ–ถโ”‚ (undici) โ”‚ โ”‚ โ”‚ โ”‚ (SQLite) โ”‚ โ”‚ (แž”แžถแž“แžŠแžถแž€แŸ‹แžƒแŸ’แž›แžถแŸ†แž„)โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ–ฒ โ”‚ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ แžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜ โ”‚ โ”‚ API แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹ โ”‚ โ”‚ โ”‚ โ”‚ 1proxy โ”‚ โ”‚ แžŸแŸแžœแžถแžแžถแž„แž›แžพ โ”‚ โ”‚ โ”‚ โ”‚ (แž€แŸ’แžšแžปแž˜แžฅแžแž‚แžทแžแžแŸ’แž›แŸƒ)โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### แžŸแž˜แžถแžŸแž—แžถแž‚แžŸแŸ†แžแžถแž“แŸ‹แŸ— | แžŸแž˜แžถแžŸแž—แžถแž‚ | แžฏแž€แžŸแžถแžš | แžแžฝแž“แžถแž‘แžธ | | --------------------------- | -------------------------------------------- | --------------------------------------------------------------- | | **แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ** | `src/lib/db/proxies.ts` | CRUD แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž’แžถแžแžปแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ แž“แžทแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžœแžทแžŸแžถแž›แž—แžถแž– | | **แžงแž”แž€แžšแžŽแŸแž”แž‰แŸ’แž‡แžผแž“แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ** | `open-sse/utils/proxyDispatcher.ts` | แž”แž„แŸ’แž€แžพแžแžงแž”แž€แžšแžŽแŸแž”แž‰แŸ’แž‡แžผแž“ `undici` ProxyAgent/SOCKS แž‡แžถแž˜แžฝแž™แž€แžถแžšแžŠแžถแž€แŸ‹แžƒแŸ’แž›แžถแŸ†แž„ | | **แž€แžถแžšแž‘แžถแž‰แž™แž€แžแžถแž˜แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ** | `open-sse/utils/proxyFetch.ts` | แžšแžปแŸ† `fetch()` แž‡แžถแž˜แžฝแž™แž€แžถแžšแž”แž‰แŸ’แž…แžผแž›แžงแž”แž€แžšแžŽแŸแž”แž‰แŸ’แž‡แžผแž“แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | **แž•แŸ’แž›แžผแžœแž€แžถแžšแž€แŸ†แžŽแžแŸ‹** | `src/app/api/settings/proxy/route.ts` | API แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž…แžถแžŸแŸ‹ (GET/PUT/DELETE) | | **แž•แŸ’แž›แžผแžœแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„** | `src/app/api/v1/management/proxies/route.ts` | API CRUD แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แž‰แŸ’แž‡แžธ (GET/POST/PATCH/DELETE) | | **แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ 1proxy** | `src/lib/db/oneproxy.ts` | แž€แžถแžšแžšแž€แŸ’แžŸแžถแž‘แžปแž€แž‡แžถแžขแž…แžทแž“แŸ’แžแŸ’แžšแŸƒแž™แŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‘แžธแž•แŸ’แžŸแžถแžšแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžฅแžแž‚แžทแžแžแŸ’แž›แŸƒ | --- ## แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ 4 แž€แž˜แŸ’แžšแžทแž OmniRoute แž‚แžถแŸ†แž‘แŸ’แžšแž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แŸ… **แžœแžทแžŸแžถแž›แž—แžถแž–แžฏแž€แžšแžถแž‡แŸ’แž™แž…แŸ†แž“แžฝแž“แž”แžฝแž“** แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แžแžถแž˜แž›แŸ†แžŠแžถแž”แŸ‹แžขแžถแž‘แžทแž—แžถแž–แŸ– ``` แž›แŸ†แžŠแžถแž”แŸ‹แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แžขแžถแž‘แžทแž—แžถแž– (แžแŸ’แž–แžŸแŸ‹แž”แŸ†แž•แžปแž โ†’ แž‘แžถแž”แž”แŸ†แž•แžปแž)แŸ– 1. ๐Ÿ”ต แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‚แžŽแž“แžธ/แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹ โ†’ แž€แŸ’แž“แžปแž„ API key / แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹ OAuth แž“แžธแž˜แžฝแž™แŸ— 2. ๐ŸŸก แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ โ†’ แž€แŸ’แž“แžปแž„แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแž“แžธแž˜แžฝแž™แŸ— (แžง. แž…แžšแžถแž…แžšแžŽแŸ OpenAI แž‘แžถแŸ†แž„แžขแžŸแŸ‹) 3. ๐ŸŸ  แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ Combo โ†’ แž€แŸ’แž“แžปแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ combo/routing แž“แžธแž˜แžฝแž™แŸ— 4. ๐ŸŸข แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŸแž€แž› โ†’ แž…แžšแžถแž…แžšแžŽแŸแž‘แžถแŸ†แž„แžขแžŸแŸ‹ แž“แžทแž„แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแž‘แžถแŸ†แž„แžขแžŸแŸ‹ ``` ### แžšแž”แŸ€แž”แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ แž“แŸ…แž–แŸแž› OmniRoute แž•แŸ’แž‰แžพแžŸแŸ†แžŽแžพแž‘แŸ…แž€แžถแž“แŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแžแžถแž„แž›แžพ แžœแžถแž แŸ… `resolveProxyForConnectionFromRegistry()` แžŠแŸ‚แž›แž–แžทแž“แžทแžแŸ’แž™แž€แž˜แŸ’แžšแžทแžแž“แžธแž˜แžฝแž™แŸ—แžแžถแž˜แž›แŸ†แžŠแžถแž”แŸ‹แŸ– 1. **แž€แž˜แŸ’แžšแžทแžแž‚แžŽแž“แžธ** โ€” แžแžพแž˜แžถแž“แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžฑแŸ’แž™ ID แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž“แŸแŸ‡แžŠแŸ‚แžšแžฌแž‘แŸ? 2. **แž€แž˜แŸ’แžšแžทแžแžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ** โ€” แžแžพแž˜แžถแž“แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžฑแŸ’แž™แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแž“แŸแŸ‡แžŠแŸ‚แžšแžฌแž‘แŸ (แžง. `openai`)? 3. **แž€แž˜แŸ’แžšแžทแžแžŸแž€แž›** โ€” แžแžพแž˜แžถแž“แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŸแž€แž›แžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŠแŸ‚แžšแžฌแž‘แŸ? 4. **แž‚แŸ’แž˜แžถแž“แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ** โ€” แžแž—แŸ’แž‡แžถแž”แŸ‹แžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹แž‘แŸ…แž€แžถแž“แŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแŸ” แž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แžŠแŸ†แž”แžผแž„แž‚แŸแž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแŸ” แž“แŸแŸ‡แž˜แžถแž“แž“แŸแž™แžแžถ แžขแŸ’แž“แž€แžขแžถแž…แž€แŸ†แžŽแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŸแž€แž›แž‡แžถแž‡แž˜แŸ’แžšแžพแžŸแž”แž˜แŸ’แžšแžปแž„ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžขแžถแž…แž€แŸ†แžŽแžแŸ‹แž‡แŸ†แž“แžฝแžŸแžœแžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ แžฌแž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แŸ” ### แžขแŸ’แžœแžธแžแŸ’แž›แŸ‡แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž†แŸ’แž›แž„แž€แžถแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | แž”แŸ’แžšแž—แŸแž‘แž…แžšแžถแž…แžšแžŽแŸ | แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ? | แž€แŸ†แžŽแžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹ | | -------------------------- | ----------------- | ----------------------------------------------- | | แž€แžถแžšแž”แŸ†แž–แŸแž‰แž€แžถแžšแž‡แž‡แŸ‚แž€ | โœ… | แžŸแŸ†แžŽแžพ `/v1/chat/completions` แž‘แžถแŸ†แž„แžขแžŸแŸ‹ | | Embeddings | โœ… | `/v1/embeddings` | | แž€แžถแžšแž”แž„แŸ’แž€แžพแžแžšแžผแž”แž—แžถแž– | โœ… | `/v1/images/generations` | | แžขแžผแžŒแžธแž™แŸ‰แžผ (TTS/STT) | โœ… | `/v1/audio/*` | | แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžš token OAuth | โœ… | แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ `unsupported_country_region_territory` | | แž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹ | โœ… | แž”แŸŠแžผแžแžปแž„ "แžŸแžถแž€แž›แŸ’แž”แž„แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹" แž”แŸ’แžšแžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | แž€แžถแžšแž’แŸ’แžœแžพแžฑแŸ’แž™ token แžแŸ’แž˜แžธ | โœ… | แž€แžถแžšแž”แž“แŸ’แžแžŸแžปแž–แž›แž—แžถแž– OAuth แž“แŸ…แž•แŸ’แž‘แŸƒแžแžถแž„แž€แŸ’แžšแŸ„แž™ | | แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แž˜แŸ‰แžผแžŠแŸ‚แž› | โœ… | แž€แžถแžšแžšแžถแž™แž”แž‰แŸ’แž‡แžธ แž“แžทแž„แž€แžถแžšแžŸแŸ’แžœแŸ‚แž„แžšแž€แž˜แŸ‰แžผแžŠแŸ‚แž› | --- ## แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ (CRUD) แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‚แžบแž‡แžถแžแžถแžšแžถแž„ SQLite (`proxy_registry`) แžŠแŸ‚แž›แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž‘แžถแŸ†แž„แžขแžŸแŸ‹แŸ” แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แžธแž˜แžฝแž™แŸ—แž˜แžถแž“แŸ– | แžœแžถแž› | แž”แŸ’แžšแž—แŸแž‘ | แžŸแŸแž…แž€แŸ’แžแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | ---------- | ------- | ------------------------------------------------------------ | | `id` | UUID | แžขแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŽแžแŸ‚แž˜แžฝแž™แž‚แžแŸ‹ | | `name` | String | แžŸแŸ’แž›แžถแž€แžŠแŸ‚แž›แž˜แž“แžปแžŸแŸ’แžŸแžขแžถแž…แžขแžถแž“แž”แžถแž“ | | `type` | String | แž–แžทแž’แžธแž€แžถแžšแŸ– `http`, `https`, `socks5` | | `host` | String | แžˆแŸ’แž˜แŸ„แŸ‡แž˜แŸ‰แžถแžŸแŸŠแžธแž“ แžฌ IP แžšแž”แžŸแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | `port` | Integer | แž›แŸแžแž…แŸ’แžšแž€ | | `username` | String | แžˆแŸ’แž˜แŸ„แŸ‡แžขแŸ’แž“แž€แž”แŸ’แžšแžพแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹ (แž”แžถแž“แžขแŸŠแžทแž“แž‚แŸ’แžšแžธแž”แž–แŸแž›แžšแž€แŸ’แžŸแžถแž‘แžปแž€) | | `password` | String | แž–แžถแž€แŸ’แž™แžŸแž˜แŸ’แž„แžถแžแŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹ (แž”แžถแž“แžขแŸŠแžทแž“แž‚แŸ’แžšแžธแž”แž–แŸแž›แžšแž€แŸ’แžŸแžถแž‘แžปแž€) | | `region` | String | แžŸแŸ’แž›แžถแž€แžแŸ†แž”แž“แŸ‹แž—แžผแž˜แžทแžŸแžถแžŸแŸ’แžแŸ’แžš | | `notes` | String | แž€แŸ†แžŽแžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แž‡แžถแžขแžแŸ’แžแž”แž‘แžŸแŸแžšแžธ | | `status` | String | `active` แžฌ `inactive` | | `source` | String | `manual` แžฌ `oneproxy` | ### แž€แžถแžšแž”แž„แŸ’แž€แžพแžแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ **แžแžถแž˜แžšแž™แŸˆแž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แŸ–** 1. แž…แžผแž›แž‘แŸ…แž€แžถแž“แŸ‹ **แž€แžถแžšแž€แŸ†แžŽแžแŸ‹ โ†’ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ** 2. แž…แžปแž… **แž”แž“แŸ’แžแŸ‚แž˜แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ** 3. แž”แŸ†แž–แŸแž‰แž”แŸ’แžšแž—แŸแž‘ host แž…แŸ’แžšแž€ แž“แžทแž„แž–แŸแžแŸŒแž˜แžถแž“แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžขแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŽแžŠแŸ‚แž›แž‡แžถแž‡แž˜แŸ’แžšแžพแžŸ 4. แžšแž€แŸ’แžŸแžถแž‘แžปแž€ **แžแžถแž˜แžšแž™แŸˆ APIแŸ–** ```bash curl -X POST http://localhost:20128/api/v1/management/proxies \ -H "Content-Type: application/json" \ -d '{ "name": "US Proxy", "type": "http", "host": "proxy.example.com", "port": 8080, "username": "user", "password": "pass", "region": "US" }' ``` ### แž€แžถแžšแž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ ```bash curl -X PATCH http://localhost:20128/api/v1/management/proxies \ -H "Content-Type: application/json" \ -d '{ "id": "proxy-uuid-here", "host": "new-proxy.example.com", "port": 9090 }' ``` > **แž…แŸ†แžŽแžถแŸ†แŸ–** แž–แŸแžแŸŒแž˜แžถแž“แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžขแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŽแž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž€แŸ’แžŸแžถแž‘แžปแž€ แž›แžปแŸ‡แžแŸ’แžšแžถแžแŸ‚แžขแŸ’แž“แž€แž•แŸ’แž‰แžพแžแž˜แŸ’แž›แŸƒแž‡แŸ†แž“แžฝแžŸแžŠแŸ‚แž›แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแžแž˜แŸ’แž›แŸƒแž‘แž‘แŸแžŠแŸ„แž™แž…แŸ’แž”แžถแžŸแŸ‹แž›แžถแžŸแŸ‹แŸ” แž€แžถแžšแž•แŸ’แž‰แžพแžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžšแž‘แž‘แŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹ `username`/`password` แž“แžนแž„แžšแž€แŸ’แžŸแžถแžแž˜แŸ’แž›แŸƒแžŠแŸ‚แž›แž”แžถแž“แž‘แžปแž€แžŸแŸ’แžšแžถแž”แŸ‹แŸ” ### แž€แžถแžšแž›แžปแž”แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ ```bash # แž”แžšแžถแž‡แŸแž™ แž”แŸ’แžšแžŸแžทแž“แž”แžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžฑแŸ’แž™แžœแžทแžŸแžถแž›แž—แžถแž–แžŽแžถแž˜แžฝแž™ curl -X DELETE "http://localhost:20128/api/v1/management/proxies?id=proxy-uuid" # แž”แž„แŸ’แžแŸ†แž›แžปแž” (แž›แžปแž”แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž—แŸ’แž‡แžถแž”แŸ‹แž•แž„แžŠแŸ‚แžš) curl -X DELETE "http://localhost:20128/api/v1/management/proxies?id=proxy-uuid&force=1" ``` ### แž€แžถแžšแžšแžถแž™แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ ```bash curl "http://localhost:20128/api/v1/management/proxies?limit=50&offset=0" ``` ### แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžฑแŸ’แž™แžœแžทแžŸแžถแž›แž—แžถแž– ```bash # แž€แŸ†แžŽแžแŸ‹แžฑแŸ’แž™แžœแžทแžŸแžถแž›แž—แžถแž–แžŸแž€แž› curl -X PUT http://localhost:20128/api/settings/proxy \ -H "Content-Type: application/json" \ -d '{"level": "global", "proxy": {"type":"http","host":"proxy.example.com","port":8080}}' # แž€แŸ†แžŽแžแŸ‹แžฑแŸ’แž™แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹ curl -X PUT http://localhost:20128/api/settings/proxy \ -H "Content-Type: application/json" \ -d '{"level": "provider", "id": "openai", "proxy": {"type":"socks5","host":"socks.example.com","port":1080}}' # แž€แŸ†แžŽแžแŸ‹แžฑแŸ’แž™แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹/key แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹ curl -X PUT http://localhost:20128/api/settings/proxy \ -H "Content-Type: application/json" \ -d '{"level": "key", "id": "connection-uuid", "proxy": {"type":"http","host":"key-proxy.com","port":3128}}' ``` ### แž€แžถแžšแžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž˜แžถแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž– แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžแžถ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž˜แžฝแž™แžŽแžถแž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แžŠแŸ‚แž›แž”แžถแž“แž•แŸ’แžแž›แŸ‹แŸ– ```bash curl "http://localhost:20128/api/settings/proxy?resolve=connection-uuid" ``` แžœแžถแžแŸ’แžšแžกแž”แŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ แž‡แžถแž˜แžฝแž™แž€แž˜แŸ’แžšแžทแžแžšแž”แžŸแŸ‹แžœแžถ (`account`, `provider`, แžฌ `global`) แž“แžทแž„แž”แŸ’แžšแž—แž–แŸ” ### แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž‡แžถแž€แŸ’แžšแžปแž˜ แž€แŸ†แžŽแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž˜แžฝแž™แž‘แŸ…แžฑแŸ’แž™แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ แžฌแž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž…แŸ’แžšแžพแž“แž€แŸ’แž“แžปแž„แž–แŸแž›แžแŸ‚แž˜แžฝแž™แŸ– ```bash curl -X POST http://localhost:20128/api/v1/management/proxies/bulk-assign \ -H "Content-Type: application/json" \ -d '{ "scope": "provider", "scopeIds": ["openai", "anthropic", "codex"], "proxyId": "proxy-uuid" }' ``` ### แž€แžถแžšแž“แžถแŸ†แž…แžผแž›/แž“แžถแŸ†แž…แŸแž‰ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแŸ’แžšแžผแžœแž”แžถแž“แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž€แŸ’แž“แžปแž„แž”แŸ’แžšแž–แŸแž“แŸ’แž’ **แž”แž˜แŸ’แžšแžปแž„แž‘แžปแž€/แžŸแŸ’แžŠแžถแžšแžกแžพแž„แžœแžทแž‰**แŸ” แž“แŸ…แž–แŸแž›แžขแŸ’แž“แž€แž“แžถแŸ†แž…แŸแž‰แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ OmniRoute แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ– 1. แž…แžผแž›แž‘แŸ…แž€แžถแž“แŸ‹ **แž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ โ†’ แž€แžถแžšแž€แŸ†แžŽแžแŸ‹ โ†’ แž”แž˜แŸ’แžšแžปแž„แž‘แžปแž€** 2. แž…แžปแž… **แž“แžถแŸ†แž…แŸแž‰** โ€” แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ แž“แžทแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž—แŸ’แž‡แžถแž”แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž› 3. แžŠแžพแž˜แŸ’แž”แžธแžŸแŸ’แžŠแžถแžšแžกแžพแž„แžœแžทแž‰ แž…แžปแž… **แž“แžถแŸ†แž…แžผแž›** แž แžพแž™แž•แŸ’แž‘แžปแž€แžกแžพแž„แžฏแž€แžŸแžถแžšแž”แž˜แŸ’แžšแžปแž„แž‘แžปแž€ แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž€แŸแž‚แžถแŸ†แž‘แŸ’แžš **upsert แžแžถแž˜ host+port** แž•แž„แžŠแŸ‚แžš โ€” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž“แžถแŸ†แž…แžผแž›แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž˜แžถแž“แžšแžฝแž…แž แžพแž™ (host แž“แžทแž„ port แžŠแžผแž…แž‚แŸ’แž“แžถ) แžœแžถแž“แžนแž„แž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž– แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แž€แžถแžšแž”แž„แŸ’แž€แžพแžแž…แŸ’แž”แžถแž”แŸ‹แž…แž˜แŸ’แž›แž„แŸ” ### แž€แžถแžšแž•แŸ’แž‘แŸแžšแž‘แžทแž“แŸ’แž“แž“แŸแž™แž–แžธแž”แŸ’แžšแž–แŸแž“แŸ’แž’แž…แžถแžŸแŸ‹ แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แŸ…แž€แŸ’แž“แžปแž„แž€แŸ†แžŽแŸ‚แž…แžถแžŸแŸ‹ (แž˜แžปแž“แž–แŸแž›แž˜แžถแž“ registry) OmniRoute แž“แžนแž„แž•แŸ’แž‘แŸแžšแž–แžฝแž€แžœแžถแžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแŸ– ``` แžƒแŸ’แž›แžถแŸ†แž„ key_value แž…แžถแžŸแŸ‹ โ†’ proxy_registry + proxy_assignments ``` แžœแžถแž“แžนแž„แž€แžพแžแžกแžพแž„แžแŸ‚แž˜แŸ’แžแž„แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ แž“แŸ…แž–แŸแž›แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แž‡แžถแž›แžพแž€แžŠแŸ†แž”แžผแž„แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž€แžถแžšแžŠแŸ†แžกแžพแž„แž€แŸ†แžŽแŸ‚แŸ” แž”แŸ’แžšแžพ `migrateLegacyProxyConfigToRegistry({ force: true })` แžŠแžพแž˜แŸ’แž”แžธแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžกแžพแž„แžœแžทแž‰แŸ” --- ## แž‘แžธแž•แŸ’แžŸแžถแžšแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžฅแžแž‚แžทแžแžแŸ’แž›แŸƒ 1proxy > ๐Ÿ†• **แžšแžฝแž˜แž…แŸ†แžŽแŸ‚แž€แžŠแŸ„แž™ [@oyi77](https://github.com/oyi77)** โ€” PR [#1847](https://github.com/diegosouzapw/OmniRoute/pull/1847) (แž”แž‰แŸ’แž แžถ [#1788](https://github.com/diegosouzapw/OmniRoute/issues/1788)) OmniRoute แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž‡แžถแž˜แžฝแž™แžœแŸแž‘แžทแž€แžถแžŸแž แž‚แž˜แž“แŸ **[1proxy](https://1proxy-api.aitradepulse.com)** แžŠแžพแž˜แŸ’แž”แžธแž•แŸ’แžแž›แŸ‹แžŸแžทแž‘แŸ’แž’แžทแž…แžผแž›แž”แŸ’แžšแžพ **แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžฅแžแž‚แžทแžแžแŸ’แž›แŸƒแžŠแŸ‚แž›แž”แžถแž“แž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แžšแžถแž”แŸ‹แžšแž™** แž–แžธแž‡แžปแŸ†แžœแžทแž‰แž–แžทแž—แž–แž›แŸ„แž€แŸ” แžœแžถแžŸแŸแž€แŸ’แžแžทแžŸแž˜แž”แŸ†แž•แžปแžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŠแŸ‚แž›แž˜แžทแž“แž˜แžถแž“แž แŸแžŠแŸ’แž‹แžถแžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แŸ” ### แžšแž”แŸ€แž”แžŠแŸ‚แž›แžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžš ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” แž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” แž”แž„แŸ’แžœแžทแž› โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ 1proxy API โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ โ”‚ proxy_registry โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ โ”‚ Provider โ”‚ โ”‚ (แžแžถแž„แž€แŸ’แžšแŸ…) โ”‚ แžšแž แžผแžแžŠแž›แŸ‹ 500 โ”‚ source=oneproxy โ”‚ แžแžถแž˜แž‚แžปแžŽแž—แžถแž– โ”‚ API โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` 1. **แž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜** โ€” OmniRoute แž‘แžถแž‰แž™แž€แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แž–แžธ 1proxy API 2. **แžšแž€แŸ’แžŸแžถแž‘แžปแž€** โ€” แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแŸ’แžšแžผแžœแž”แžถแž“แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž€แŸ’แž“แžปแž„แžแžถแžšแžถแž„ `proxy_registry` แžŠแžผแž…แž‚แŸ’แž“แžถ แž‡แžถแž˜แžฝแž™ `source = 'oneproxy'` 3. **แžแŸ’แžšแž„** โ€” แžแŸ’แžšแž„แžแžถแž˜แž”แŸ’แžšแžผแžแžผแž€แžผแž› แž”แŸ’แžšแž‘แŸแžŸ แž“แžทแž„แž–แžทแž“แŸ’แž‘แžปแž‚แžปแžŽแž—แžถแž– 4. **แž”แž„แŸ’แžœแžทแž›** โ€” แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž›แŸ’แžขแž”แŸ†แž•แžปแžแžŠแŸ„แž™แž”แŸ’แžšแžพแž™แžปแž‘แŸ’แž’แžŸแžถแžŸแŸ’แžแŸ’แžšแž•แŸ’แžขแŸ‚แž€แž›แžพแž‚แžปแžŽแž—แžถแž– แž…แŸƒแžŠแž“แŸ’แž™ แžฌแžแžถแž˜แž›แŸ†แžŠแžถแž”แŸ‹ 5. **แž”แž“แŸ’แžแž™แž‚แžปแžŽแž—แžถแž–แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท** โ€” แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžšแžถแž‡แŸแž™แž“แžนแž„แžแŸ’แžšแžผแžœแž”แž“แŸ’แžแž™แž–แžทแž“แŸ’แž‘แžปแž‚แžปแžŽแž—แžถแž–แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแž‘แžถแž”แž‡แžถแž„แž€แž˜แŸ’แžšแžทแžแž€แŸ†แžŽแžแŸ‹ โ†’ แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžแžถแžขแžŸแž€แž˜แŸ’แž˜ ### แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ **แžแžถแž˜แžšแž™แŸˆแž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แŸ–** 1. แž…แžผแž›แž‘แŸ…แž€แžถแž“แŸ‹แž•แŸ’แž‘แžถแŸ†แž„ **Settings โ†’ 1proxy** 2. แž…แžปแž… **"Sync Now"** 3. แž˜แžพแž›แžŸแŸ’แžแžทแžแžทแŸ– แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŸแžšแžปแž” แž…แŸ†แž“แžฝแž“แžŸแž€แž˜แŸ’แž˜ แž‚แžปแžŽแž—แžถแž–แž˜แž’แŸ’แž™แž˜ แž“แžทแž„แž€แžถแžšแž”แŸ‚แž„แž…แŸ‚แž€แžแžถแž˜แž”แŸ’แžšแž‘แŸแžŸ **แžแžถแž˜แžšแž™แŸˆ APIแŸ–** ```bash # แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜ curl -X POST http://localhost:20128/api/settings/oneproxy \ -H "Content-Type: application/json" \ -d '{}' # แž€แžถแžšแž†แŸ’แž›แžพแž™แžแž”แŸ– # { "success": true, "added": 127, "updated": 45, "failed": 2, "total": 172 } ``` ### แž€แžถแžšแžแŸ’แžšแž„แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ ```bash # แžแŸ’แžšแž„แžแžถแž˜แž”แŸ’แžšแžผแžแžผแž€แžผแž› curl "http://localhost:20128/api/settings/oneproxy?protocol=socks5" # แžแŸ’แžšแž„แžแžถแž˜แž”แŸ’แžšแž‘แŸแžŸ curl "http://localhost:20128/api/settings/oneproxy?countryCode=US" # แžแŸ’แžšแž„แžแžถแž˜แž–แžทแž“แŸ’แž‘แžปแž‚แžปแžŽแž—แžถแž–แžขแž”แŸ’แž”แž”แžšแž˜แžถ curl "http://localhost:20128/api/settings/oneproxy?minQuality=80" # แž”แž‰แŸ’แž…แžผแž›แžแž˜แŸ’แžšแž„แž…แžผแž›แž‚แŸ’แž“แžถ curl "http://localhost:20128/api/settings/oneproxy?protocol=http&countryCode=DE&minQuality=70" ``` ### แž–แžทแž“แŸ’แž‘แžปแž‚แžปแžŽแž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ 1proxy แž“แžธแž˜แžฝแž™แŸ—แž—แŸ’แž‡แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™แž‘แžทแž“แŸ’แž“แž“แŸแž™แž˜แŸแžแžถแŸ– | แžœแžถแž› | แž€แžถแžšแž–แžทแž–แžŽแŸŒแž“แžถ | | --------------- | --------------------------------------------- | | `qualityScore` | แž–แžทแž“แŸ’แž‘แžป 0-100 แž–แžธแž€แžถแžšแž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แžšแž”แžŸแŸ‹ 1proxy | | `latencyMs` | แž—แžถแž–แž™แžบแžแž“แŸƒแž”แžŽแŸ’แžแžถแž‰แžŠแŸ‚แž›แž”แžถแž“แžœแžถแžŸแŸ‹แžœแŸ‚แž„ | | `anonymity` | `transparent`, `anonymous` แžฌ `elite` | | `googleAccess` | แžแžถแžแžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแžŸแŸแžœแžถแž€แž˜แŸ’แž˜ Google แž”แžถแž“แžฌแžขแžแŸ‹ | | `countryCode` | แž€แžผแžŠแž”แŸ’แžšแž‘แŸแžŸ ISO แž–แžธแžšแžแžฝแžขแž€แŸ’แžŸแžš | | `lastValidated` | แžแŸ’แžšแžถแž–แŸแž›แžœแŸแž›แžถแž“แŸƒแž€แžถแžšแž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แž…แžปแž„แž€แŸ’แžšแŸ„แž™ | แž–แžทแž“แŸ’แž‘แžปแž‚แžปแžŽแž—แžถแž–แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ‚แžŸแž˜แŸ’แžšแžฝแž›แžŠแŸ„แž™แžแžถแž˜แžœแž“แŸ’แžแŸ– - **แžŸแŸ†แžŽแžพแžŠแŸ‚แž›แž”แžšแžถแž‡แŸแž™** แž”แž“แŸ’แžแž™แž–แžทแž“แŸ’แž‘แžปแž…แŸ†แž“แžฝแž“ 10 แž–แžทแž“แŸ’แž‘แžป - **แž–แžทแž“แŸ’แž‘แžปแž’แŸ’แž›แžถแž€แŸ‹แž…แžปแŸ‡แžŠแž›แŸ‹ โ‰ค10** โ†’ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแŸ’แžšแžผแžœแž”แžถแž“แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แž‡แžถ `inactive` - แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžขแžŸแž€แž˜แŸ’แž˜แžแŸ’แžšแžผแžœแž”แžถแž“แžŠแž€แž…แŸแž‰แž–แžธแž€แžถแžšแž”แž„แŸ’แžœแžทแž› ### แž™แžปแž‘แŸ’แž’แžŸแžถแžŸแŸ’แžแŸ’แžšแž”แž„แŸ’แžœแžทแž› ```bash # แž”แž„แŸ’แžœแžทแž›แžแžถแž˜แž‚แžปแžŽแž—แžถแž– (แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž›แŸ’แžขแž”แŸ†แž•แžปแžแž˜แžปแž“) โ€” แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \ -H "Content-Type: application/json" \ -d '{"strategy": "quality"}' # แž€แžถแžšแž”แž„แŸ’แžœแžทแž›แž…แŸƒแžŠแž“แŸ’แž™ curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \ -d '{"strategy": "random"}' # แžแžถแž˜แž›แŸ†แžŠแžถแž”แŸ‹ (แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แž˜แžปแž“แž‚แŸแž”แž„แŸ’แžขแžŸแŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž‡แŸ’แžšแžพแžŸแž˜แžปแž“) curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \ -d '{"strategy": "sequential"}' ``` ### แžงแž”แž€แžšแžŽแŸแž•แŸ’แžแžถแž…แŸ‹แžŸแŸ€แž‚แŸ’แžœแžธ แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜ 1proxy แž˜แžถแž“แžงแž”แž€แžšแžŽแŸแž•แŸ’แžแžถแž…แŸ‹แžŸแŸ€แž‚แŸ’แžœแžธแžŠแŸ‚แž›แž—แŸ’แž‡แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™แŸ– - แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธ **แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แž”แžšแžถแž‡แŸแž™แž‡แžถแž”แŸ‹แž‚แŸ’แž“แžถ 5 แžŠแž„** แž€แžถแžšแž–แŸ’แž™แžถแž™แžถแž˜แž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แž”แž“แŸ’แžแŸ‚แž˜แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹ - แž€แŸ†แžŽแžแŸ‹แžกแžพแž„แžœแžทแž‰แžŠแŸ„แž™แŸ– `resetOneproxyCircuitBreaker()` แžฌแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž”แž˜แŸ’แžšแžพแžกแžพแž„แžœแžทแž‰ - แžŸแŸ’แžแžถแž“แž—แžถแž–แž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แžขแžถแž…แžšแž€แž”แžถแž“แž“แŸ… `GET /api/settings/oneproxy?action=status` ### แž€แžถแžšแžŸแž˜แŸ’แžขแžถแžแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ 1proxy ```bash # แž›แžปแž”แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ 1proxy แž˜แžฝแž™ curl -X DELETE "http://localhost:20128/api/settings/oneproxy?id=proxy-uuid" # แžŸแž˜แŸ’แžขแžถแžแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ 1proxy แž‘แžถแŸ†แž„แžขแžŸแŸ‹ (แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แž‰แŸ’แž…แžผแž›แžŠแŸ„แž™แžŠแŸƒแž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ‰แŸ‡แž–แžถแž›แŸ‹) curl -X DELETE "http://localhost:20128/api/settings/oneproxy?clearAll=1" ``` --- ## แž€แžถแžšแž”แŸ’แžšแž†แžถแŸ†แž„แž€แžถแžšแžšแž€แžƒแžพแž‰ แž“แžทแž„แž—แžถแž–แž›แžถแž€แŸ‹แž›แŸ€แž˜ OmniRoute แž˜แžทแž“แžแŸ’แžšแžนแž˜แžแŸ‚แž”แž‰แŸ’แž‡แžผแž“แž…แžšแžถแž…แžšแžŽแŸแžแžถแž˜แžšแž™แŸˆแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แž‘แŸ โ€” แžœแžถแž’แŸ’แžœแžพแžฑแŸ’แž™แž…แžšแžถแž…แžšแžŽแŸแž˜แžพแž›แž‘แŸ…แžŸแŸ’แžšแž”แž…แŸ’แž”แžถแž”แŸ‹แž•แž„แžŠแŸ‚แžšแŸ– ### แž€แžถแžšแž€แŸ’แž›แŸ‚แž„แž”แž“แŸ’แž›แŸ†แžŸแŸ’แž“แžถแž˜แž˜แŸ’แžšแžถแž˜แžŠแŸƒ TLS แž”แŸ’แžšแžพ `wreq-js` แžŠแžพแž˜แŸ’แž”แžธแž”แž„แŸ’แž€แžพแžแžŸแŸ’แž“แžถแž˜แž˜แŸ’แžšแžถแž˜แžŠแŸƒ TLS แžŠแŸ‚แž›แž˜แžถแž“แž›แž€แŸ’แžแžŽแŸˆแžŠแžผแž…แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€ แžŠแŸ„แž™แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžšแž€แžƒแžพแž‰แž”แžปแžแžŠแŸ‚แž›แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แžŠแŸƒ TLS แž˜แžทแž“แž˜แŸ‚แž“แž–แžธแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€แŸ” ### แž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แžŸแŸ’แž“แžถแž˜แž˜แŸ’แžšแžถแž˜แžŠแŸƒ CLI **แž”แŸŠแžผแžแžปแž„แž”แžทแž‘แž”แžพแž€แžŸแŸ’แž“แžถแž˜แž˜แŸ’แžšแžถแž˜แžŠแŸƒ CLI** (`Settings โ†’ Security`) แžšแŸ€แž”แž›แŸ†แžŠแžถแž”แŸ‹ HTTP headers แž“แžทแž„แžœแžถแž› JSON body แžกแžพแž„แžœแžทแž‰ แžŠแžพแž˜แŸ’แž”แžธแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แž“แžนแž„แž แžแŸ’แžแž›แŸแžแžถแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แžšแž”แžŸแŸ‹ CLI binaries แžŠแžพแž˜ (Claude Code, Codex แž‡แžถแžŠแžพแž˜)แŸ” แžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžš **แž”แž“แŸ’แžแŸ‚แž˜แž–แžธแž›แžพ** แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแŸ– ``` IP แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ (แžแŸ’แžšแžผแžœแž”แžถแž“แž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹) โ†’ IP แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ (US) โ†’ API แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ + แž€แžถแžšแž€แŸ’แž›แŸ‚แž„แž”แž“แŸ’แž›แŸ† TLS + แžŸแŸ’แž“แžถแž˜แž˜แŸ’แžšแžถแž˜แžŠแŸƒ CLI ``` แžขแŸ’แž“แž€แž‘แž‘แžฝแž›แž”แžถแž“แž‘แžถแŸ†แž„ **แž€แžถแžšแž›แžถแž€แŸ‹แž”แžถแŸ†แž„ IP** แž“แžทแž„ **แž—แžถแž–แžแŸ’แžšแžนแž˜แžแŸ’แžšแžผแžœแž“แŸƒแžŸแŸ†แžŽแžพ** แž€แŸ’แž“แžปแž„แž–แŸแž›แžŠแŸ†แžŽแžถแž›แž‚แŸ’แž“แžถแŸ” ### แž€แžถแžšแžšแž€แŸ’แžŸแžถแž‘แžปแž€ IP แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ แž•แŸ’แž›แžถแž€แžŸแž‰แŸ’แž‰แžถแžŠแŸ‚แž›แž˜แžถแž“แž€แžผแžŠแž–แžŽแŸŒแž“แŸ…แž€แŸ’แž“แžปแž„แž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž”แž„แŸ’แž แžถแž‰แžแžถแž€แž˜แŸ’แžšแžทแžแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŽแžถแž˜แžฝแž™แž€แŸ†แž–แžปแž„แžŸแž€แž˜แŸ’แž˜แŸ– | แž•แŸ’แž›แžถแž€แžŸแž‰แŸ’แž‰แžถ | แž€แž˜แŸ’แžšแžทแž | แžขแžแŸ’แžแž“แŸแž™ | | ---------- | ------------- | ----------------------------------------------------------- | | ๐ŸŸข | แžŸแž€แž› | แž…แžšแžถแž…แžšแžŽแŸแž‘แžถแŸ†แž„แžขแžŸแŸ‹แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แŸแŸ‡ | | ๐ŸŸก | แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ | แž˜แžถแž“แžแŸ‚แž…แžšแžถแž…แžšแžŽแŸแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแž“แŸแŸ‡แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แžŠแŸ‚แž›แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | ๐Ÿ”ต | แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹ | แžŸแŸ„/แž‚แžŽแž“แžธแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž“แŸแŸ‡แž”แŸ’แžšแžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แŸแŸ‡ | แž•แŸ’แž›แžถแž€แžŸแž‰แŸ’แž‰แžถแž€แŸแž”แž„แŸ’แž แžถแž‰ IP แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แž•แž„แžŠแŸ‚แžšแŸ” --- ## แžšแž”แŸ€แž”แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ Upstream แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแžŠแŸ‚แž›แž”แŸ’แžšแžพแž›แŸ†แž“แžถแŸ† CLIProxyAPI OmniRoute แž‚แžถแŸ†แž‘แŸ’แžšแžšแž”แŸ€แž”แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ upstream แž…แŸ†แž“แžฝแž“แž”แžธแŸ– | แžšแž”แŸ€แž” | แžŸแŸแž…แž€แŸ’แžแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | ------------- | ----------------------------------------------------------- | | `native` | OmniRoute แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž€แžถแžšแž”แž‰แŸ’แž‡แžผแž“แžแžถแž˜แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹ (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜) | | `cliproxyapi` | แž•แŸ’แž‘แŸแžšแž—แžถแžšแž€แžทแž…แŸ’แž…แž‘แŸ… instance CLIProxyAPI แžแžถแž„แž€แŸ’แžšแŸ… | | `fallback` | แžŸแžถแž€แž›แŸ’แž”แž„ native แž‡แžถแž˜แžปแž“ แž แžพแž™แž”แŸ’แžแžผแžšแž‘แŸ… CLIProxyAPI แž”แŸ’แžšแžŸแžทแž“แž”แžพแž”แžšแžถแž‡แŸแž™ | แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžแžถแž˜แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแž“แžธแž˜แžฝแž™แŸ—แŸ– ```bash curl -X PUT "http://localhost:20128/api/upstream-proxy/openai" \ -H "Content-Type: application/json" \ -d '{"mode": "native", "enabled": true}' ``` --- ## UI แž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ ### Settings โ†’ แž•แŸ’แž‘แžถแŸ†แž„ Proxy - แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ **แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŸแž€แž›** (แž€แŸ†แžŽแžแŸ‹แž˜แŸ’แžแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž…แžšแžถแž…แžšแžŽแŸแž‘แžถแŸ†แž„แžขแžŸแŸ‹) - แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž‡แŸ†แž“แžฝแžŸ **แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแžถแž˜แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ** - แž€แžถแžšแž€แŸ†แžŽแžแŸ‹ **แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแžถแž˜แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹** - **แž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹** แžแžถแž˜แžšแž™แŸˆแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ - **แž•แŸ’แž›แžถแž€แžŸแž‰แŸ’แž‰แžถแžŠแŸ‚แž›แž˜แžถแž“แž€แžผแžŠแž–แžŽแŸŒ** แž”แž„แŸ’แž แžถแž‰แž€แž˜แŸ’แžšแžทแžแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŸแž€แž˜แŸ’แž˜ ### Settings โ†’ แž•แŸ’แž‘แžถแŸ†แž„ 1proxy - แž”แŸŠแžผแžแžปแž„ **แž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แžฅแžกแžผแžœแž“แŸแŸ‡** แžŠแžพแž˜แŸ’แž”แžธแž‘แžถแž‰แž™แž€แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžฅแžแž‚แžทแžแžแŸ’แž›แŸƒ - **แž€แžถแžแžŸแŸ’แžแžทแžแžท**แŸ– แžŸแžšแžปแž”, แžŸแž€แž˜แŸ’แž˜, แž‚แžปแžŽแž—แžถแž–แž˜แž’แŸ’แž™แž˜, แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แž…แžปแž„แž€แŸ’แžšแŸ„แž™ - **แžแž˜แŸ’แžšแž„**แŸ– แž–แžทแž’แžธแž€แžถแžš, แž€แžผแžŠแž”แŸ’แžšแž‘แŸแžŸ, แž‚แžปแžŽแž—แžถแž–แžขแž”แŸ’แž”แž”แžšแž˜แžถ - **แžแžถแžšแžถแž„แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ** แžŠแŸ‚แž›แž˜แžถแž“ host, แž–แžทแž’แžธแž€แžถแžš, แž”แŸ’แžšแž‘แŸแžŸ, แž–แžทแž“แŸ’แž‘แžปแž‚แžปแžŽแž—แžถแž–, แž—แžถแž–แž™แžบแžแž™แŸ‰แžถแžœ, แž—แžถแž–แžขแž“แžถแž˜แžทแž€, แž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพ Google - แž•แŸ’แž‘แžถแŸ†แž„ **แžŸแŸ’แžแžถแž“แž—แžถแž–แž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜** แžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแžแžถแž˜แžŠแžถแž“แž‡แŸ„แž‚แž‡แŸแž™/แž”แžšแžถแž‡แŸแž™ แž“แžทแž„แž…แŸ†แž“แžฝแž“แž”แžšแžถแž‡แŸแž™แž‡แžถแž”แŸ‹แŸ—แž‚แŸ’แž“แžถ - **แžŸแž˜แŸ’แžขแžถแžแž‘แžถแŸ†แž„แžขแžŸแŸ‹** แžŠแžพแž˜แŸ’แž”แžธแž›แžปแž”แž’แžถแžแžป 1proxy แž‘แžถแŸ†แž„แžขแžŸแŸ‹ --- ## แžฏแž€แžŸแžถแžšแž™แŸ„แž„ API ### API แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžแŸ’แžš | Endpoint | แžŸแŸแž…แž€แŸ’แžแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | ----------- | ---------------------------------------------- | ---------------------------------------------- | | `GET` | `/api/settings/proxy` | แž‘แž‘แžฝแž›แž™แž€แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž–แŸแž‰แž›แŸแž‰ | | `GET` | `/api/settings/proxy?level=global` | แž‘แž‘แžฝแž›แž™แž€แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŸแž€แž› | | `GET` | `/api/settings/proxy?level=provider&id=openai` | แž‘แž‘แžฝแž›แž™แž€แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ | | `GET` | `/api/settings/proxy?resolve=connectionId` | แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž˜แžถแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž– | | `PUT` | `/api/settings/proxy` | แž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž–แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | `DELETE` | `/api/settings/proxy?level=provider&id=openai` | แž›แžปแž”แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แŸ…แž€แž˜แŸ’แžšแžทแžแž“แŸแŸ‡ | ### API แž”แž‰แŸ’แž‡แžธแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžแŸ’แžš | Endpoint | แžŸแŸแž…แž€แŸ’แžแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | ----------- | ------------------------------------------------- | -------------------------- | | `GET` | `/api/v1/management/proxies` | แžšแžถแž™แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‘แžถแŸ†แž„แžขแžŸแŸ‹ | | `GET` | `/api/v1/management/proxies?id=uuid` | แž‘แž‘แžฝแž›แž™แž€แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแžถแž˜ ID | | `GET` | `/api/v1/management/proxies?id=uuid&where_used=1` | แž‘แž‘แžฝแž›แž™แž€แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | `POST` | `/api/v1/management/proxies` | แž”แž„แŸ’แž€แžพแžแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | `PATCH` | `/api/v1/management/proxies` | แž’แŸ’แžœแžพแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | `DELETE` | `/api/v1/management/proxies?id=uuid` | แž›แžปแž”แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | `DELETE` | `/api/v1/management/proxies?id=uuid&force=1` | แž”แž„แŸ’แžแŸ†แž›แžปแž” | | `POST` | `/api/v1/management/proxies/bulk-assign` | แž€แŸ†แžŽแžแŸ‹แž‡แžถแž€แŸ’แžšแžปแž˜ | | `GET` | `/api/v1/management/proxies/assignments` | แžšแžถแž™แž”แž‰แŸ’แž‡แžธแž€แžถแžšแž€แŸ†แžŽแžแŸ‹ | | `GET` | `/api/v1/management/proxies/health` | แžŸแŸ’แžแžทแžแžทแžŸแžปแžแž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | ### API แž•แŸ’แž›แžผแžœแžšแžผแž„แž€แŸ’แžšแŸ„แž˜แžŠแžธ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž”แžพแž€แžฑแŸ’แž™ instance OmniRoute แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแž”แžถแž“แžแžถแž˜แžขแŸŠแžธแž“แž’แžบแžŽแžทแžแžŸแžถแž’แžถแžšแžŽแŸˆ (Cloudflare/ngrok/Tailscale) แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แž€แžถแžšแž”แž‰แŸ’แž‡แžผแž“แž…แŸแž‰แžแžถแž˜แžšแž™แŸˆแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ แžŸแžผแž˜แž˜แžพแž› [TUNNELS_GUIDE.md](./TUNNELS_GUIDE.md)แŸ” REST API แžšแž”แžŸแŸ‹แž•แŸ’แž›แžผแžœแžšแžผแž„แž€แŸ’แžšแŸ„แž˜แžŠแžธแžŸแŸ’แžแžทแžแž“แŸ…แž€แŸ’แžšแŸ„แž˜ `/api/tunnels/{cloudflared,ngrok,tailscale}/*` แž แžพแž™แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แž–แžธแžแŸ’แžŸแŸ‚แžŸแž„แŸ’แžœแžถแž€แŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž…แŸแž‰แžŠแŸ‚แž›แž”แžถแž“แž…แž„แž€แŸ’แžšแž„แž‡แžถแžฏแž€แžŸแžถแžšแžแžถแž„แž›แžพแŸ” ### API 1proxy | แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžแŸ’แžš | Endpoint | แžŸแŸแž…แž€แŸ’แžแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | ----------- | -------------------------------------- | ------------------------------------ | | `GET` | `/api/settings/oneproxy` | แžšแžถแž™แž”แž‰แŸ’แž‡แžธแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ 1proxy | | `GET` | `/api/settings/oneproxy?action=stats` | แž‘แž‘แžฝแž›แž™แž€แžŸแŸ’แžแžทแžแžท + แžŸแŸ’แžแžถแž“แž—แžถแž–แž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜ | | `GET` | `/api/settings/oneproxy?action=status` | แž‘แž‘แžฝแž›แž™แž€แžแŸ‚แžŸแŸ’แžแžถแž“แž—แžถแž–แž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜ | | `POST` | `/api/settings/oneproxy` | แž€แŸแŸ‡แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜ | | `POST` | `/api/settings/oneproxy/rotate` | แž”แŸ’แžแžผแžšแž‘แŸ…แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž”แž“แŸ’แž‘แžถแž”แŸ‹ | | `DELETE` | `/api/settings/oneproxy?id=uuid` | แž›แžปแž”แž˜แžฝแž™ | | `DELETE` | `/api/settings/oneproxy?clearAll=1` | แžŸแž˜แŸ’แžขแžถแžแž‘แžถแŸ†แž„แžขแžŸแŸ‹ | ### API แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ Upstream | แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžแŸ’แžš | Endpoint | แžŸแŸแž…แž€แŸ’แžแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | ----------- | --------------------------------- | ------------------------------------------- | | `GET` | `/api/upstream-proxy/:providerId` | แž‘แž‘แžฝแž›แž™แž€แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ upstream | | `PUT` | `/api/upstream-proxy/:providerId` | แž€แŸ†แžŽแžแŸ‹แžšแž”แŸ€แž”แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ upstream | | `DELETE` | `/api/upstream-proxy/:providerId` | แž›แžปแž”แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ upstream | --- ## แžขแžแŸแžšแž”แžšแžทแžŸแŸ’แžแžถแž“ | แžขแžแŸแžš | แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ | แžŸแŸแž…แž€แŸ’แžŠแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | --------------------- | -------- | ------------------------------------------------------------------------- | | `ENABLE_SOCKS5_PROXY` | `true` | แž”แžพแž€แž€แžถแžšแž‚แžถแŸ†แž‘แŸ’แžšแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ SOCKS5 (แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‚แžบ `true` แž€แŸ’แž“แžปแž„ `.env.example`) | --- ## แž€แžถแžšแžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถ ### "แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ SOCKS5 แžแŸ’แžšแžผแžœแž”แžถแž“แž”แžทแž‘" แž€แŸ†แžŽแžแŸ‹ `ENABLE_SOCKS5_PROXY=true` แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžš `.env` แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ แž แžพแž™แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แžกแžพแž„แžœแžทแž‰แŸ” ### แž€แŸ†แž แžปแžŸ "socket hang up" แžแžถแž˜แžšแž™แŸˆแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ แž“แŸแŸ‡แž‡แžถแžšแžฟแž„แž’แž˜แŸ’แž˜แžแžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแž˜แŸ’แž›แŸƒแžแŸ„แž€แžŠแŸ‚แž›แž•แŸ’แžŠแžถแž…แŸ‹แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แžŠแŸ‚แž›แž‘แŸ†แž“แŸแžšแŸ” OmniRoute แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถแž“แŸแŸ‡แžšแžฝแž…แž แžพแž™แžŠแŸ„แž™แŸ– - แž”แžทแž‘ keep-alive แž›แžพแž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ (`keepAliveTimeout: 1`) - แž”แžทแž‘ pipelining (`pipelining: 0`) - แžšแž€แŸ’แžŸแžถแž‘แžปแž€ dispatchers แž€แŸ’แž“แžปแž„แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹ แžŠแžพแž˜แŸ’แž”แžธแž‡แŸ€แžŸแžœแžถแž„แž€แžถแžšแž’แŸ’แžœแžพ handshakes แž˜แŸ’แžŠแž„แž แžพแž™แž˜แŸ’แžŠแž„แž‘แŸ€แž แž”แŸ’แžšแžŸแžทแž“แž”แžพแž”แž‰แŸ’แž แžถแž“แŸ…แžแŸ‚แž”แž“แŸ’แž แžŸแžผแž˜แžŸแžถแž€แž›แŸ’แž”แž„แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž•แŸ’แžŸแŸแž„ แžฌแž”แŸ’แžšแžพแž˜แžปแžแž„แžถแžšแž”แž„แŸ’แžœแžทแž›แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžšแž”แžŸแŸ‹ 1proxyแŸ” ### "unsupported_country_region_territory" แžขแŸ†แžกแžปแž„แž–แŸแž› OAuth แžแŸ’แžšแžผแžœแž”แŸ’แžšแžถแž€แžŠแžแžถแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ **แž˜แžปแž“แž–แŸแž›** แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แž›แŸ†แž แžผแžš OAuthแŸ” OmniRoute แž”แž‰แŸ’แž‡แžผแž“แž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแžแžผแžแžนแž“ OAuth แžแžถแž˜แžšแž™แŸˆแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แŸ” แž‡แžถแžŠแŸ†แž”แžผแž„ แžŸแžผแž˜แž€แŸ†แžŽแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž€แž˜แŸ’แžšแžทแžแžŸแž€แž› แžฌแž€แž˜แŸ’แžšแžทแžแžขแŸ’แž“แž€แž•แŸ’แžŠแž›แŸ‹แžŸแŸแžœแžถ แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž‘แžพแž”แž—แŸ’แž‡แžถแž”แŸ‹แŸ” ### แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพ แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แž›แŸ†แžŠแžถแž”แŸ‹แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แŸ– 1. แž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แž‡แžถแž˜แžฝแž™ `GET /api/settings/proxy?resolve=your-connection-id` 2. แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžแžถแžแžพ `status` แžšแž”แžŸแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‚แžบ `active` (แž˜แžทแž“แž˜แŸ‚แž“ `inactive`) 3. แžแŸ’แžšแžผแžœแž”แŸ’แžšแžถแž€แžŠแžแžถแžœแžทแžŸแžถแž›แž—แžถแž–แž€แŸ†แžŽแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแž“แžนแž„แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ ### แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜ 1proxy แž”แžšแžถแž‡แŸแž™ แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžŸแŸ’แžแžถแž“แž—แžถแž–แžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แŸ– ```bash curl "http://localhost:20128/api/settings/oneproxy?action=status" ``` แž”แŸ’แžšแžŸแžทแž“แž”แžพ `consecutiveFailures >= 5` แž“แŸ„แŸ‡ circuit breaker แž”แžถแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแŸ” แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžกแžพแž„แžœแžทแž‰แžŠแžพแž˜แŸ’แž”แžธแž€แŸ†แžŽแžแŸ‹แžกแžพแž„แžœแžทแž‰ แžฌแžšแž„แŸ‹แž…แžถแŸ†แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžกแžพแž„แžœแžทแž‰แžŠแŸ„แž™แžŠแŸƒแŸ” --- ## แž‚แŸ’แžšแŸ„แž„แž€แžถแžšแžŽแŸแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ ### แžแžถแžšแžถแž„ `proxy_registry` ```sql CREATE TABLE proxy_registry ( id TEXT PRIMARY KEY, name TEXT NOT NULL, type TEXT NOT NULL DEFAULT 'http', host TEXT NOT NULL, port INTEGER NOT NULL, username TEXT DEFAULT '', password TEXT DEFAULT '', region TEXT, notes TEXT, status TEXT DEFAULT 'active', source TEXT NOT NULL DEFAULT 'manual', -- 'manual' แžฌ 'oneproxy' quality_score INTEGER, -- 0-100 (แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ‚ 1proxy) latency_ms INTEGER, -- แž˜แžทแž›แŸ’แž›แžธแžœแžทแž“แžถแž‘แžธ (แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ‚ 1proxy) anonymity TEXT, -- แžแŸ’แž›แžถ/แžขแž“แžถแž˜แžทแž€/แž€แž˜แŸ’แžšแžทแžแžแŸ’แž–แžŸแŸ‹ google_access INTEGER DEFAULT 0, -- แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพ Google แž”แžถแž“แž‘แŸ? (1proxy) last_validated TEXT, -- แžแŸ’แžšแžถแž–แŸแž›แžœแŸแž›แžถ ISO (1proxy) country_code TEXT, -- แž€แžผแžŠ ISO 2 แžขแž€แŸ’แžŸแžš (1proxy) created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); ``` ### แžแžถแžšแžถแž„ `proxy_assignments` ```sql CREATE TABLE proxy_assignments ( id INTEGER PRIMARY KEY AUTOINCREMENT, proxy_id TEXT NOT NULL REFERENCES proxy_registry(id), scope TEXT NOT NULL, -- 'global', 'provider', 'account', 'combo' scope_id TEXT, -- ID แžขแŸ’แž“แž€แž•แŸ’แžŠแž›แŸ‹แžŸแŸแžœแžถ, ID แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹ แžฌ ID แž”แž“แŸ’แžŸแŸ† created_at TEXT NOT NULL, updated_at TEXT NOT NULL, UNIQUE(scope, scope_id) ); ``` --- ## แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžŸแžปแžแž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ (v3.8.16+) แž™แž“แŸ’แžแž€แžถแžš **แž”แžšแžถแž‡แŸแž™แžšแž แŸแžŸแžšแž”แžŸแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ** แžšแž”แžŸแŸ‹ OmniRoute (`src/lib/proxyHealth.ts`) แžšแž€แžƒแžพแž‰แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž›แŸ‚แž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž› <2s แžแžถแž˜แžšแž™แŸˆแž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹ TCP แžšแž แŸแžŸ แž แžพแž™แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ **แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž›แž‘แŸ’แž’แž•แž›แž€แŸ’แž“แžปแž„แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹** แžŠแžพแž˜แŸ’แž”แžธแž‡แŸ€แžŸแžœแžถแž„แž”แž“แŸ’แž‘แžปแž€แž”แž“แŸ’แžแŸ‚แž˜แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแŸ†แžŽแžพแž“แžธแž˜แžฝแž™แŸ—แŸ” ### แžšแž”แŸ€แž”แžŠแŸ†แžŽแžพแžšแž€แžถแžš ``` แžŸแŸ†แžŽแžพ โ”€โ”€โ–ถ ProxyHealthCache.get(url) โ”‚ โ”œโ”€ แžšแž€แžƒแžพแž‰แž€แŸ’แž“แžปแž„แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹ + แž“แŸ…แžแŸ’แž˜แžธ? โ”€โ”€โ–ถ แžแŸ’แžšแžกแž”แŸ‹แžŸแŸ’แžแžถแž“แž—แžถแž–แžŠแŸ‚แž›แž”แžถแž“แžšแž€แŸ’แžŸแžถแž‘แžปแž€ โ”‚ โ””โ”€ แž˜แžทแž“แž˜แžถแž“แž€แŸ’แž“แžปแž„แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹ / แž แžฝแžŸแžŸแžปแž–แž›แž—แžถแž–? โ”€โ”€โ–ถ TCP แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ… host:port (แžขแžŸแŸ‹แž–แŸแž›แžšแž„แŸ‹แž…แžถแŸ†: FAST_FAIL_TIMEOUT_MS) โ”€โ”€โ–ถ แžšแž€แŸ’แžŸแžถแž‘แžปแž€แžŸแž˜แŸ’แžšแžถแž”แŸ‹ HEALTH_CACHE_TTL_MS โ”€โ”€โ–ถ แžแŸ’แžšแžกแž”แŸ‹แž›แž‘แŸ’แž’แž•แž› ``` แž”แžพแž‚แŸ’แž˜แžถแž“แž™แž“แŸ’แžแž€แžถแžšแž“แŸแŸ‡ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž›แŸ‚แž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แžนแž„แžšแžถแžšแžถแŸ†แž„แžŸแŸ†แžŽแžพแž“แžธแž˜แžฝแž™แŸ—แž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž›แž–แŸแž‰แž›แŸแž‰แž“แŸƒ `PROXY_TIMEOUT_MS` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ 30s) แž˜แžปแž“แž“แžนแž„แž”แžšแžถแž‡แŸแž™แŸ” ### แžขแžแŸแžšแž”แžšแžทแžŸแŸ’แžแžถแž“แžŠแŸ‚แž›แžขแžถแž…แž€แŸ‚แžŸแž˜แŸ’แžšแžฝแž›แž”แžถแž“ | แžขแžแŸแžš | แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ | แž‚แŸ„แž›แž”แŸ†แžŽแž„ | | ---------------------------- | -------- | -------------------------------------------------------------- | | `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | แž–แŸแž›แžขแžŸแŸ‹แž€แŸ†แžŽแžแŸ‹แž“แŸƒแž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹ TCP แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžŸแžปแžแž—แžถแž–แž“แžธแž˜แžฝแž™แŸ— | | `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | แžšแž™แŸˆแž–แŸแž›แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž›แž‘แŸ’แž’แž•แž›แžŸแžปแžแž—แžถแž–แž€แŸ’แž“แžปแž„แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹ | **แžแž˜แŸ’แž›แŸƒแžŠแŸ‚แž›แž”แžถแž“แžŽแŸ‚แž“แžถแŸ†แŸ–** | แžŸแŸแžŽแžถแžšแžธแž™แŸ‰แžผ | แž–แŸแž›แžขแžŸแŸ‹แž€แŸ†แžŽแžแŸ‹แž”แžšแžถแž‡แŸแž™แžšแž แŸแžŸ | TTL แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹ | แž˜แžผแž›แž แŸแžแžป | | --------------------------------- | --------------------- | ----------------- | ----------------------------------------------------------------------------------------------- | | API gateway แžŠแŸ‚แž›แž˜แžถแž“แž›แŸ†แž แžผแžšแžแŸ’แž–แžŸแŸ‹ | 1500ms | 60000ms | แž”แžšแžถแž‡แŸแž™แžฑแŸ’แž™แž”แžถแž“แž†แžถแž”แŸ‹แž™แŸ‰แžถแž„แžŸแž€แž˜แŸ’แž˜ แž“แžทแž„แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž€แŸ’แž“แžปแž„แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹แž™แžผแžšแž‡แžถแž„แž˜แžปแž“ แžŠแžพแž˜แŸ’แž”แžธแž€แžถแžแŸ‹แž”แž“แŸ’แžแž™แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™ | | แžแŸ’แž“แžถแŸ†แž„แž…แŸ‚แž€แž…แžถแž™แžแžถแž˜แž—แžผแž˜แžทแžŸแžถแžŸแŸ’แžแŸ’แžš | 3000ms | 15000ms | แž”แžŽแŸ’แžŠแžถแž‰แž™แžบแžแžแŸ’แžšแžผแžœแž€แžถแžšแž–แŸแž›แž…แŸ’แžšแžพแž“แž‡แžถแž„แž˜แžปแž“; แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹แžแŸ’แž›แžธแž‡แžถแž„แž˜แžปแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž”แŸ’แžŠแžผแžšแž‘แžทแžŸแž–แŸแž›แž”แžšแžถแž‡แŸแž™แž™แŸ‰แžถแž„แžšแž แŸแžŸ | | แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แž / แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แž | 1000ms | 10000ms | แž€แžถแžšแž’แŸ’แžœแžพแžกแžพแž„แžœแžทแž‰แž™แŸ‰แžถแž„แžšแž แŸแžŸแž›แžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž˜แžผแž›แžŠแŸ’แž‹แžถแž“ | | แž€แžถแžšแž›แžถแž€แŸ‹แžแŸ’แž›แžฝแž“ / แž€แžถแžšแž”แŸ’แžšแž†แžถแŸ†แž„แž€แžถแžšแžšแž€แžƒแžพแž‰ | 2500ms | 45000ms | แž‡แŸ€แžŸแžœแžถแž„แž€แžถแžšแžŸแŸ’แž‘แž„แŸ‹แž˜แžพแž›แž‰แžนแž€แž‰แžถแž”แŸ‹ แžŠแŸ‚แž›แžขแžถแž…แž”แž„แŸ’แž€แžฑแŸ’แž™แž˜แžถแž“แžŠแŸ‚แž“แž€แŸ†แžŽแžแŸ‹แžขแžแŸ’แžšแžถ | ### แž€แžถแžšแž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž›แžŸแžปแžแž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ ```ts import { getAllProxyHealthStatuses, invalidateProxyHealth } from "omniroute/proxyHealth"; const statuses = getAllProxyHealthStatuses(); for (const s of statuses) { console.log(`${s.proxyUrl} โ†’ healthy=${s.healthy}, stale=${s.stale}`); } // แž”แž„แŸ’แžแŸ†แžฑแŸ’แž™แžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž˜แžฝแž™แžกแžพแž„แžœแžทแž‰ invalidateProxyHealth("http://user:pass@203.0.113.7:8080"); ``` แž‘แž„แŸ‹ `stale` แž˜แžถแž“แžแž˜แŸ’แž›แŸƒ `true` แž“แŸ…แž–แŸแž›แž’แžถแžแžปแž€แŸ’แž“แžปแž„แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹แž”แžถแž“แž›แžพแžŸ `HEALTH_CACHE_TTL_MS` แž แžพแž™แžŸแŸ†แžŽแžพแž”แž“แŸ’แž‘แžถแž”แŸ‹แž“แžนแž„แž”แž„แŸ’แž€แžฑแŸ’แž™แž˜แžถแž“แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžแŸ’แž˜แžธแŸ” ### แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžแžถแž˜แž”แŸ’แžšแž—แŸแž‘แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แžธแž˜แžฝแž™แŸ— แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžŸแžปแžแž—แžถแž–แž”แŸ’แžšแžพแžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžŸแž˜แžŸแŸ’แžšแž” แžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพแž‚แŸ’แžšแŸ„แž„แž€แžถแžšแžŽแŸ URLแŸ– | แž‚แŸ’แžšแŸ„แž„แž€แžถแžšแžŽแŸ | แž…แŸ’แžšแž€แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ | | -------------------------- | ------------ | | `http://` | 8080 | | `https://` | 443 | | `socks5://` / `socks5h://` | 1080 | แž…แŸ’แžšแž€แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แž€แŸ’แž“แžปแž„ URL (`http://host:9999`) แžแŸ‚แž„แžแŸ‚แž˜แžถแž“แžขแžถแž‘แžทแž—แžถแž–แž›แžพแžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžšแž”แžŸแŸ‹แž‚แŸ’แžšแŸ„แž„แž€แžถแžšแžŽแŸแŸ” --- ## แž€แžถแžšแžœแžทแž—แžถแž‚ แž“แžทแž„แž€แžถแžšแžŸแž„แŸ’แž€แŸแžแž˜แžพแž›แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ OmniRoute แžแžถแž˜แžŠแžถแž“แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžแžถแž˜แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แžธแž˜แžฝแž™แŸ— แžŠแžพแž˜แŸ’แž”แžธแž‡แžฝแž™แžฑแŸ’แž™แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžšแž’แŸ’แžœแžพแžšแŸ„แž‚แžœแžทแž“แžทแž…แŸ’แž†แŸแž™แž›แŸ†แž“แžถแŸ†แž”แž‰แŸ’แž‡แžผแž“ แžŸแŸ’แžแžถแž“แž—แžถแž–แž€แžพแž“แžกแžพแž„แž—แŸ’แž›แžถแž˜แŸ—แž“แŸƒแž—แžถแž–แž™แžบแžแž™แŸ‰แžถแžœ แž“แžทแž„แž€แŸ†แž แžปแžŸแžŠแŸ‚แž›แž€แžพแžแžกแžพแž„แžŠแžŠแŸ‚แž›แŸ—แŸ” ### แžขแŸ’แžœแžธแžแŸ’แž›แŸ‡แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แžแžถแž˜แžŠแžถแž“ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžšแžถแž›แŸ‹แžŸแŸ†แžŽแžพแžŠแŸ‚แž›แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ OmniRoute แž€แžแŸ‹แžแŸ’แžšแžถแŸ– | แž˜แŸ‰แŸ‚แžแŸ’แžšแžœแžถแžŸแŸ‹ | แž€แžถแžšแž–แžทแž–แžŽแŸŒแž“แžถ | | ------------ | ---------------------------------------------------------------------- | | `proxy_url` | URL แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž–แŸแž‰แž›แŸแž‰ (แžŠแŸ„แž™แž›แžถแž€แŸ‹แž–แŸแžแŸŒแž˜แžถแž“แžŸแž˜แŸ’แž„แžถแžแŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แžขแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŽ) | | `provider` | ID แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแžแžถแž„แž›แžพ (openai, anthropic แž‡แžถแžŠแžพแž˜) | | `latency_ms` | แžšแž™แŸˆแž–แŸแž›แžŸแžšแžปแž”แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž’แŸ’แžœแžพแžŠแŸ†แžŽแžพแžšแž‘แŸ…แž˜แž€ แžšแžฝแž˜แž‘แžถแŸ†แž„แž€แžถแžšแž…แžถแž”แŸ‹แžŠแŸƒแž‡แžถแž˜แžฝแž™แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ | | `connect_ms` | แžšแž™แŸˆแž–แŸแž›แžแž—แŸ’แž‡แžถแž”แŸ‹ TCP แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ | | `status` | แž€แžผแžŠแžŸแŸ’แžแžถแž“แž—แžถแž– HTTP แž–แžธแž”แŸ’แžšแž—แž–แžแžถแž„แž›แžพ | | `error` | แž”แŸ’แžšแž—แŸแž‘แž€แŸ†แž แžปแžŸ แž”แŸ’แžšแžŸแžทแž“แž”แžพแžŸแŸ†แžŽแžพแž”แžถแž“แž”แžšแžถแž‡แŸแž™ | | `timestamp` | ISO 8601 UTC | ### แž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแž‘แžทแž“แŸ’แž“แž“แŸแž™ ```bash # แž–แŸ’แžšแžนแžแŸ’แžแžทแž€แžถแžšแžŽแŸแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแŸ’แž˜แžธแŸ— curl -H "Authorization: Bearer $OMNIROUTE_KEY" \ "http://localhost:20128/api/usage/proxy-logs?limit=100" ``` แž…แŸ†แžŽแžปแž…แž”แž‰แŸ’แž…แž”แŸ‹แž–แžทแžแž”แŸ’แžšแžถแž€แžŠแž‚แžบ `/api/usage/proxy-logs` (แžŸแžผแž˜แž˜แžพแž› `src/app/api/usage/proxy-logs/route.ts`)แŸ” แž…แŸ†แžŽแžปแž…แž”แž‰แŸ’แž…แž”แŸ‹แž“แŸแŸ‡แž‚แžถแŸ†แž‘แŸ’แžšแŸ– - `GET /api/usage/proxy-logs` โ€” แž‘แžถแž‰แž™แž€แž€แŸ†แžŽแžแŸ‹แž แŸแžแžปแž”แŸ’แžšแžผแž€แžŸแŸŠแžธ - `DELETE /api/usage/proxy-logs` โ€” แžŸแž˜แŸ’แžขแžถแžแž€แŸ†แžŽแžแŸ‹แž แŸแžแžปแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‘แžถแŸ†แž„แžขแžŸแŸ‹ แžŸแŸ’แžแžทแžแžทแžŸแžšแžปแž”แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแžถแž€แžŸแžฝแžšแžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹แž–แžธแžแžถแžšแžถแž„ `proxy_logs` แžแžถแž˜แžšแž™แŸˆ SQL แž”แŸ’แžšแžŸแžทแž“แž”แžพแž…แžถแŸ†แž”แžถแž…แŸ‹แŸ” แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž“แŸƒแž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžขแžถแž…แž•แŸ’แžแž›แŸ‹แž‡แžผแž“แž‘แžทแžŠแŸ’แž‹แž—แžถแž–แžŸแŸ’แžแžทแžแžทแžŸแžšแžปแž”แŸ” ### แž›แŸ†แž“แžถแŸ†แž‘แžผแž‘แŸ… **แžšแž€แžƒแžพแž‰แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž˜แžทแž“แžŸแŸ’แžแžทแžšแž—แžถแž–** (แž”แŸ’แžแžผแžšแž†แŸ’แž›แžถแžŸแŸ‹แžšแžœแžถแž„แž‡แŸ„แž‚แž‡แŸแž™/แž”แžšแžถแž‡แŸแž™)แŸ– ```sql SELECT proxy_url, COUNT(*) AS total, SUM(CASE WHEN status >= 500 THEN 1 ELSE 0 END) AS errors, ROUND(100.0 * SUM(CASE WHEN status >= 500 THEN 1 ELSE 0 END) / COUNT(*), 1) AS error_pct FROM proxy_logs WHERE timestamp > datetime('now', '-1 hour') GROUP BY proxy_url HAVING error_pct > 5 ORDER BY error_pct DESC; ``` **แžŸแŸ’แžœแŸ‚แž„แžšแž€แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž™แžบแž** (แž—แžถแž–แž™แžบแžแž™แŸ‰แžถแžœ p95 > 2 แžœแžทแž“แžถแž‘แžธ)แŸ– ```sql WITH ranked AS ( SELECT proxy_url, latency_ms, PERCENT_RANK() OVER (PARTITION BY proxy_url ORDER BY latency_ms) AS pct FROM proxy_logs WHERE timestamp > datetime('now', '-24 hour') ) SELECT proxy_url, latency_ms FROM ranked WHERE pct >= 0.95 ORDER BY latency_ms DESC; ``` --- ## แž˜แŸ‚แž€แž’แžถแž„แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž™แžปแž‘แŸ’แž’แžŸแžถแžŸแŸ’แžแŸ’แžšแž”แŸ’แžแžผแžšแžœแŸแž“ แž“แŸ…แž–แŸแž›แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž…แŸ’แžšแžพแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แž‘แŸ…แžฑแŸ’แž™แžœแžทแžŸแžถแž›แž—แžถแž–แž˜แžฝแž™ OmniRoute แž”แŸ’แžšแžพ **แž™แžปแž‘แŸ’แž’แžŸแžถแžŸแŸ’แžแŸ’แžšแž”แŸ’แžแžผแžšแžœแŸแž“** แžŠแžพแž˜แŸ’แž”แžธแž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แŸ’แžšแžพแžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŸแŸ†แžŽแžพแž“แžธแž˜แžฝแž™แŸ—แŸ” แž™แžปแž‘แŸ’แž’แžŸแžถแžŸแŸ’แžแŸ’แžšแž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž“แŸ…แž€แž˜แŸ’แžšแžทแžแžœแžทแžŸแžถแž›แž—แžถแž– (แžŸแž€แž› แžแžถแž˜แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ แžแžถแž˜แž‚แžŽแž“แžธ แžฌแžแžถแž˜แž”แž“แŸ’แžŸแŸ†)แŸ” ### แž™แžปแž‘แŸ’แž’แžŸแžถแžŸแŸ’แžแŸ’แžšแžŠแŸ‚แž›แž˜แžถแž“ | แž™แžปแž‘แŸ’แž’แžŸแžถแžŸแŸ’แžแŸ’แžš | แž–แŸแž›แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แŸ’แžšแžพ | แž€แžถแžšแžŠแŸ„แŸ‡แžŠแžผแžš | | -------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | | `quality` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜) | แž”แžšแžทแžŸแŸ’แžแžถแž“แž•แž›แžทแžแž€แž˜แŸ’แž˜แžŠแŸ‚แž›แž˜แžถแž“แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‚แžปแžŽแž—แžถแž–แž…แž˜แŸ’แžšแžปแŸ‡ | แž•แŸ’แžแž›แŸ‹แžขแžถแž‘แžทแž—แžถแž–แžŠแž›แŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแžœแžถแž™แžแž˜แŸ’แž›แŸƒแžแŸ’แž–แžŸแŸ‹ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžขแžถแž…แž’แŸ’แžœแžพแžฑแŸ’แž™แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแžœแžถแž™แžแž˜แŸ’แž›แŸƒแž‘แžถแž”แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพ | | `random` | แž€แžถแžšแž…แŸ‚แž€แž…แžถแž™แž”แž“แŸ’แž‘แžปแž€ แž“แžทแž„แžฏแž€แž‡แž“แž—แžถแž– | แž…แŸ‚แž€แž…แžถแž™แžŸแŸ’แž˜แžพแž‚แŸ’แž“แžถ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž˜แžทแž“แžขแžพแž–แžพแž“แžนแž„แžŸแž‰แŸ’แž‰แžถแž‚แžปแžŽแž—แžถแž– | | `sequential` | แž€แžถแžšแž”แŸ†แž”แžถแžแŸ‹แž€แŸ†แž แžปแžŸ แž“แžทแž„แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแžŠแŸ‚แž›แžขแžถแž…แž€แŸ†แžŽแžแŸ‹แž›แž‘แŸ’แž’แž•แž›แž”แžถแž“ | แž”แŸ’แžแžผแžšแž†แŸ’แž›แž„แž€แžถแžแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžแžถแž˜แž›แŸ†แžŠแžถแž”แŸ‹ แž แžพแž™แž„แžถแž™แžŸแŸ’แžšแžฝแž›แž™แž›แŸ‹แžขแŸ†แž–แžธแžฅแžšแžทแž™แžถแž”แžแžšแž”แžŸแŸ‹แžœแžถ | ### แž˜แŸ‚แž€แž’แžถแž„แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แž ``` แžแžพแžขแŸ’แž“แž€แž˜แžถแž“แž–แžทแž“แŸ’แž‘แžปแž‚แžปแžŽแž—แžถแž–แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แžŠแŸ‚แžšแžฌแž‘แŸ? โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ แž˜แžถแž“ แž‚แŸ’แž˜แžถแž“ โ”‚ โ”‚ แžแžพแž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‘แžถแŸ†แž„แžขแžŸแŸ‹ โ”‚ แž˜แžถแž“แž‚แžปแžŽแž—แžถแž–แž”แŸ’แžšแž แžถแž€แŸ‹แž”แŸ’แžšแž แŸ‚แž›แž‚แŸ’แž“แžถ โ”‚ แžŠแŸ‚แžšแžฌแž‘แŸ? โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ แž˜แžถแž“ แž‚แŸ’แž˜แžถแž“ แž”แŸ’แžšแžพ โ”‚ โ”‚ `random` โ”‚ โ”‚ (แž€แžถแžšแž…แŸ‚แž€แž…แžถแž™แžŸแŸ’แž˜แžพแž‚แŸ’แž“แžถ โ”‚ โ”‚ แž”แž„แŸ’แž€แžพแžแž‘แžทแž“แŸ’แž“แž“แŸแž™แž‚แžปแžŽแž—แžถแž– โ”‚ โ”‚ แž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž›แž™แžผแžš) โ”‚ โ”‚ โ”‚ แž”แŸ’แžšแžพ `quality` โ”‚ (แž›แŸ’แžขแž”แŸ†แž•แžปแžแžŸแž˜แŸ’แžšแžถแž”แŸ‹ โ”‚ แž‚แžปแžŽแž—แžถแž–แž…แž˜แŸ’แžšแžปแŸ‡) โ”‚ แž”แŸ’แžšแžพ `random` (แž…แŸ‚แž€แž…แžถแž™แž”แž“แŸ’แž‘แžปแž€ แžฑแŸ’แž™แžŸแŸ’แž˜แžพแž‚แŸ’แž“แžถ) ``` ## แž€แžถแžšแžŠแž€แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แžŠแŸ‚แž›แž”แžšแžถแž‡แŸแž™แž…แŸแž‰แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท แž€แŸ’แžšแžปแž˜แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž€แŸ’แž“แžปแž„แž‘แžธแž•แŸ’แžŸแžถแžš 1proxy แž”แž“แŸ’แžแž™แžขแžถแž‘แžทแž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžšแžถแž‡แŸแž™แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแžšแžฝแž…แž แžพแž™ (แžŸแžผแž˜แž˜แžพแž› [แž–แžทแž“แŸ’แž‘แžปแž‚แžปแžŽแž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ](#proxy-quality-scores))แŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹ แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž› **แžขแŸ’แž“แž€** แž”แžถแž“แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ…แž€แŸ’แž“แžปแž„แž”แž‰แŸ’แž‡แžธแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡ แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ†แžŽแžแŸ‹แž–แŸแž›แžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžŸแžปแžแž—แžถแž–แž“แŸ…แž•แŸ’แž‘แŸƒแžแžถแž„แž€แŸ’แžšแŸ„แž™ (`src/lib/proxyHealth/scheduler.ts`) แž•แŸ’แžแž›แŸ‹แžฅแžšแžทแž™แžถแž”แžแžŠแžผแž…แž‚แŸ’แž“แžถ แž‚แžบ ยซแžŠแž€แžŸแž˜แžถแž‡แžทแž€แžŠแŸ‚แž›แž›แŸ‚แž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž…แŸแž‰แž–แžธ แžแŸ’แžŸแŸ‚แžŸแž„แŸ’แžœแžถแž€แŸ‹แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทยป แžŠแŸ„แž™แž˜แžทแž“แž›แžปแž”แžขแŸ’แžœแžธแž‘แžถแŸ†แž„แžขแžŸแŸ‹แŸ– ```bash # .env โ€” แž”แžทแž‘แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž‡แžถแž”แžŽแŸ’แžŠแŸ„แŸ‡แžขแžถแžŸแž“แŸ’แž“ แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž€แžถแžšแžŸแŸ’แž‘แž„แŸ‹แž–แžทแž“แžทแžแŸ’แž™แž”แžšแžถแž‡แŸแž™แž‡แžถแž”แŸ‹แž‚แŸ’แž“แžถ 3 แžŠแž„ แž แžพแž™แž”แžพแž€แžœแžถแžกแžพแž„แžœแžทแž‰ # แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท แž“แŸ…แž–แŸแž›แžœแžถแž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แž†แŸ’แž›แžพแž™แžแž”แž“แžนแž„แž€แžถแžšแžŸแŸ’แž‘แž„แŸ‹แž–แžทแž“แžทแžแŸ’แž™แž˜แŸ’แžŠแž„แž‘แŸ€แžแŸ” PROXY_AUTO_DISABLE=true PROXY_AUTO_REMOVE_AFTER=3 ``` แžšแž”แŸ€แž”แžŠแŸ‚แž›แžœแžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸ…แž€แŸ’แž“แžปแž„แžแŸ’แžŸแŸ‚แžŸแž„แŸ’แžœแžถแž€แŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž…แŸ’แžšแžพแž“แŸ– 1. แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ†แžŽแžแŸ‹แž–แŸแž›แž“แžนแž„แžŸแŸ’แž‘แž„แŸ‹แž–แžทแž“แžทแžแŸ’แž™แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž”แžถแž“แž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แž“แžธแž˜แžฝแž™แŸ— แžšแŸ€แž„แžšแžถแž›แŸ‹ `PROXY_HEALTH_INTERVAL_MS` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ 10 แž“แžถแž‘แžธ; แžขแž”แŸ’แž”แž”แžšแž˜แžถ 1 แž“แžถแž‘แžธ)แŸ” 2. แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž˜แžถแž“แž€แžถแžšแž”แžšแžถแž‡แŸแž™ **แžŠแŸ‚แž›แžขแžถแž…แžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“แž”แžถแž“แž…แŸ’แž”แžถแžŸแŸ‹แž›แžถแžŸแŸ‹** แž‡แžถแž”แŸ‹แž‚แŸ’แž“แžถแž…แŸ†แž“แžฝแž“ `PROXY_AUTO_REMOVE_AFTER` แžŠแž„ (แž€แžถแžšแž”แžšแžถแž‡แŸแž™แž€แŸ’แž“แžปแž„แž€แžถแžš แžแž—แŸ’แž‡แžถแž”แŸ‹แž–แžทแžแž”แŸ’แžšแžถแž€แžŠ โ€” แž€แžถแžšแžขแžŸแŸ‹แž–แŸแž›แžšแž„แŸ‹แž…แžถแŸ† แžฌแž€แŸ†แž แžปแžŸ 5xx แžšแž”แžŸแŸ‹แž‚แŸ„แž›แžŠแŸ…แžŸแŸ’แž‘แž„แŸ‹แž–แžทแž“แžทแžแŸ’แž™แž•แŸ’แž‘แžถแž›แŸ‹ แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แžšแžถแž”แŸ‹แžกแžพแž™ แžŸแžผแž˜แž˜แžพแž› [แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžŸแžปแžแž—แžถแž–แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ](#proxy-health-checking-v3816)) `status` แžšแž”แžŸแŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แž‘แŸ…แž‡แžถ `dead`แŸ” 3. `dead` แž‚แžบแž‡แžถแžŸแŸ’แžแžถแž“แž—แžถแž–แž˜แžฝแž™แž€แŸ’แž“แžปแž„แž…แŸ†แžŽแŸ„แž˜แžŸแŸ’แžแžถแž“แž—แžถแž–แžŠแŸ‚แž›แžแž˜แŸ’แžšแž„แžŸแŸ’แžแžถแž“แž—แžถแž–แž“แŸ…แžŠแŸ†แžŽแžพแžšแž€แžถแžš แžŠแŸ‚แž›แž”แŸ’แžšแžพแžŠแŸ„แž™แž€แžถแžšแžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž€แŸ’แžšแžปแž˜/แž€แžถแžšแž”แŸ’แžŠแžผแžšแžœแŸแž“ แž“แžนแž„แžŠแž€แž…แŸแž‰ แžŠแžผแž…แŸ’แž“แŸแŸ‡แž€แžถแžšแž”แŸ’แžŠแžผแžšแžœแŸแž“แžšแž”แžŸแŸ‹แžœแžทแžŸแžถแž›แž—แžถแž–แž˜แžฝแž™ (round-robin / random / sticky / latency โ€” แžŸแžผแž˜แž˜แžพแž› [แž˜แŸ‚แž€แž’แžถแž„แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž™แžปแž‘แŸ’แž’แžŸแžถแžŸแŸ’แžแŸ’แžšแž”แŸ’แžŠแžผแžšแžœแŸแž“](#rotation-strategy-decision-tree)) แž“แžนแž„แžˆแž”แŸ‹แž”แŸ’แžšแž‚แž›แŸ‹แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž“แŸ„แŸ‡แž‘แŸ…แžฑแŸ’แž™แžŸแŸ†แžŽแžพแžแŸ’แž˜แžธแŸ—แž—แŸ’แž›แžถแž˜แŸ—แŸ” แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž“แŸ…แž€แŸ’แž“แžปแž„ แž€แŸ’แžšแžปแž˜แž˜แžทแž“แžšแž„แž•แž›แž”แŸ‰แŸ‡แž–แžถแž›แŸ‹แž‘แŸ แž แžพแž™แž€แŸ’แžšแžปแž˜แž‘แžถแŸ†แž„แž˜แžผแž›แž€แŸแž˜แžทแž“แžŠแŸ‚แž›แž”แŸ’แžŠแžผแžšแž‘แŸ…แž”แŸ’แžšแžพแž€แžถแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แž•แŸ’แž‘แžถแž›แŸ‹แžŠแŸ„แž™แžŸแŸ’แž„แŸ€แž˜แžŸแŸ’แž„แžถแžแŸ‹แžŠแŸ‚แžš โ€” แžŸแžผแž˜แž˜แžพแž›แžšแž”แžถแŸ†แž„แž”แžทแž‘แž“แŸ…แž–แŸแž›แž”แžšแžถแž‡แŸแž™แž“แŸƒ [แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ 4 แž€แž˜แŸ’แžšแžทแž](#4-level-proxy-system)แŸ” 4. แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ†แžŽแžแŸ‹แž–แŸแž›แž”แž“แŸ’แžแžŸแŸ’แž‘แž„แŸ‹แž–แžทแž“แžทแžแŸ’แž™แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ `dead` แžแžถแž˜แž…แž“แŸ’แž›แŸ„แŸ‡แž–แŸแž›แžŠแžŠแŸ‚แž›แŸ” แž€แžถแžšแžŸแŸ’แž‘แž„แŸ‹แž–แžทแž“แžทแžแŸ’แž™แž‡แŸ„แž‚แž‡แŸแž™แž›แžพแž€แž”แž“แŸ’แž‘แžถแž”แŸ‹ แž“แžนแž„แž”แŸ’แžŠแžผแžš `status` แžแŸ’แžšแžกแž”แŸ‹แž‘แŸ…แž‡แžถ `active` แž แžพแž™แžœแžถแž“แžนแž„แž…แžผแž›แž€แŸ’แž“แžปแž„แž€แžถแžšแž”แŸ’แžŠแžผแžšแžœแŸแž“แžกแžพแž„แžœแžทแž‰ โ€” แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹แž”แž“แŸ’แžแŸ‚แž˜แžกแžพแž„แžœแžทแž‰แžŠแŸ„แž™แžŠแŸƒแž‘แŸแŸ” แž˜แžปแžแž„แžถแžšแž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž…แž“แžถแžกแžพแž„แžŠแŸ„แž™แž…แŸแžแž“แžถ แžŠแžพแž˜แŸ’แž”แžธแžฑแŸ’แž™ **แžแŸ’แžšแžผแžœแž”แžพแž€แž”แŸ’แžšแžพแžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„ แž“แžทแž„แž˜แžทแž“แž”แž„แŸ’แž€แž€แžถแžšแž”แŸ†แž•แŸ’แž›แžทแž…แž”แŸ†แž•แŸ’แž›แžถแž‰**แŸ– แžแžถแž˜แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ†แžŽแžแŸ‹แž–แŸแž›แž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚ แžšแžถแž”แŸ‹ แž“แžทแž„แž€แžแŸ‹แžแŸ’แžšแžถแž€แžถแžšแž”แžšแžถแž‡แŸแž™แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ (แžŸแžผแž˜แž˜แžพแž›แž‚แŸ„แž›แž€แžถแžšแžŽแŸ C แž€แŸ’แž“แžปแž„ `decision.ts`) แž แžพแž™ `PROXY_AUTO_DISABLE` แž˜แžทแž“แžŠแŸ‚แž›แž›แžปแž”แž‡แžฝแžšแž‘แžทแž“แŸ’แž“แž“แŸแž™แžกแžพแž™ โ€” แž“แŸ„แŸ‡แž‡แžถแž˜แžปแžแž„แžถแžšแžšแž”แžŸแŸ‹แž‘แž„แŸ‹ `PROXY_AUTO_REMOVE` แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€ แžŠแŸ‚แž›แž˜แžถแž“แž›แž€แŸ’แžแžŽแŸˆแžแžนแž„แžšแŸ‰แžนแž„แž‡แžถแž„แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแž‘แžถแŸ†แž„แž–แžธแžšแžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แž‘แŸ…แž‡แžถ `true` แž“แŸ„แŸ‡ `PROXY_AUTO_REMOVE` แž˜แžถแž“แžขแžถแž‘แžทแž—แžถแž– (แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแžŠแŸ‚แž›แž แŸ€แž”แž“แžนแž„แžแŸ’แžšแžผแžœแž›แžปแž” แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹แžแŸ’แžšแžผแžœแž”แžทแž‘แž‡แžถแž”แžŽแŸ’แžŠแŸ„แŸ‡แžขแžถแžŸแž“แŸ’แž“แž“แŸ…แž…แž“แŸ’แž›แŸ„แŸ‡แž–แŸแž›แž“แŸ„แŸ‡แž‘แŸ)แŸ” แžŸแžผแž˜แž˜แžพแž›แžฏแž€แžŸแžถแžšแž™แŸ„แž„ [แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แžšแžทแžŸแŸ’แžแžถแž“](../reference/ENVIRONMENT.md) แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แž‰แŸ’แž‡แžธแžขแžแŸแžšแž‘แžถแŸ†แž„แž˜แžผแž›แŸ” --- > ๐Ÿ“– **แžฏแž€แžŸแžถแžšแž–แžถแž€แŸ‹แž–แŸแž“แŸ’แž’แŸ–** > > - [แž˜แž‚แŸ’แž‚แžปแž‘แŸ’แž‘แŸแžŸแž€แŸแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹](../guides/USER_GUIDE.md) โ€” แž€แžถแžšแžŠแŸ†แžกแžพแž„ แž“แžทแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž‘แžผแž‘แŸ… > - [แžฏแž€แžŸแžถแžšแž™แŸ„แž„ API](../reference/API_REFERENCE.md) โ€” แžฏแž€แžŸแžถแžš API แž–แŸแž‰แž›แŸแž‰ > - [แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แžšแžทแžŸแŸ’แžแžถแž“](../reference/ENVIRONMENT.md) โ€” แžขแžแŸแžšแž”แžšแžทแžŸแŸ’แžแžถแž“แž‘แžถแŸ†แž„แžขแžŸแŸ‹