OmniRoute Dashboard # ๐Ÿš€ OmniRoute โ€” ๋ฌด๋ฃŒ AI ๊ฒŒ์ดํŠธ์›จ์ด ### ์ฝ”๋”ฉ์„ ๋ฉˆ์ถ”์ง€ ๋งˆ์„ธ์š”. ์ž๋™ ํด๋ฐฑ์„ ํ†ตํ•ด **๋ฌด๋ฃŒ ๋ฐ ์ €๊ฐ€ํ˜• AI ๋ชจ๋ธ**๋กœ ์Šค๋งˆํŠธ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. _๋ฒ”์šฉ API ํ”„๋ก์‹œ โ€” ํ•˜๋‚˜์˜ ์—”๋“œํฌ์ธํŠธ, 36๊ฐœ ์ด์ƒ์˜ ๊ณต๊ธ‰์ž, ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„ ์—†์Œ._ **์ฑ„ํŒ… ์™„๋ฃŒ โ€ข ์ž„๋ฒ ๋”ฉ โ€ข ์ด๋ฏธ์ง€ ์ƒ์„ฑ โ€ข ์˜ค๋””์˜ค โ€ข ์ˆœ์œ„ ์žฌ์ง€์ • โ€ข 100% TypeScript** --- ### ๐Ÿค– ์ข‹์•„ํ•˜๋Š” ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ๋ฌด๋ฃŒ AI ์ œ๊ณต์—…์ฒด _๋ฌด์ œํ•œ ์ฝ”๋”ฉ์„ ์œ„ํ•œ ๋ฌด๋ฃŒ API ๊ฒŒ์ดํŠธ์›จ์ด์ธ OmniRoute๋ฅผ ํ†ตํ•ด AI ๊ธฐ๋ฐ˜ IDE ๋˜๋Š” CLI ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜์„ธ์š”._
OpenClaw
OpenClaw

โญ 205K
NanoBot
NanoBot

โญ 20.9K
PicoClaw
PicoClaw

โญ 14.6K
ZeroClaw
ZeroClaw

โญ 9.9K
IronClaw
IronClaw

โญ 2.1K
OpenCode
OpenCode

โญ 106K
Codex CLI
Codex CLI

โญ 60.8K
Claude Code
Claude Code

โญ 67.3K
Gemini CLI
Gemini CLI

โญ 94.7K
Kilo Code
Kilo Code

โญ 15.5K
๐Ÿ“ก ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” http://localhost:20128/v1 ๋˜๋Š” http://cloud.omniroute.online/v1์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. โ€” ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ, ๋ฌด์ œํ•œ ๋ชจ๋ธ ๋ฐ ํ• ๋‹น๋Ÿ‰ --- [![npm version](https://img.shields.io/npm/v/omniroute?color=cb3837&logo=npm)](https://www.npmjs.com/package/omniroute) [![Docker Hub](https://img.shields.io/docker/v/diegosouzapw/omniroute?label=Docker%20Hub&logo=docker&color=2496ED)](https://hub.docker.com/r/diegosouzapw/omniroute) [![License](https://img.shields.io/github/license/diegosouzapw/OmniRoute)](https://github.com/diegosouzapw/OmniRoute/blob/main/LICENSE) [![Website](https://img.shields.io/badge/Website-omniroute.online-blue?logo=google-chrome&logoColor=white)](https://omniroute.online) [![WhatsApp](https://img.shields.io/badge/WhatsApp-Community-25D366?logo=whatsapp&logoColor=white)](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t) [๐ŸŒ Website](https://omniroute.online) ยท [๐Ÿš€ Quick Start](#-quick-start) ยท [๐Ÿ’ก Features](#-key-features) ยท [๐Ÿ“– Docs](#-documentation) ยท [๐Ÿ’ฐ Pricing](#-pricing-at-a-glance) ยท [๐Ÿ’ฌ WhatsApp](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t) ๐ŸŒ **Available in:** ๐Ÿ‡บ๐Ÿ‡ธ [English](README.md) | ๐Ÿ‡ง๐Ÿ‡ท [Portuguรชs (Brasil)](README.pt-BR.md) | ๐Ÿ‡ช๐Ÿ‡ธ [Espaรฑol](README.es.md) | ๐Ÿ‡ซ๐Ÿ‡ท [Franรงais](README.fr.md) | ๐Ÿ‡ฎ๐Ÿ‡น [Italiano](README.it.md) | ๐Ÿ‡ท๐Ÿ‡บ [ะ ัƒััะบะธะน](README.ru.md) | ๐Ÿ‡จ๐Ÿ‡ณ [ไธญๆ–‡ (็ฎ€ไฝ“)](README.zh-CN.md) | ๐Ÿ‡ฉ๐Ÿ‡ช [Deutsch](README.de.md) | ๐Ÿ‡ฎ๐Ÿ‡ณ [เคนเคฟเคจเฅเคฆเฅ€](README.in.md) | ๐Ÿ‡น๐Ÿ‡ญ [เน„เธ—เธข](README.th.md) | ๐Ÿ‡บ๐Ÿ‡ฆ [ะฃะบั€ะฐั—ะฝััŒะบะฐ](README.uk-UA.md) | ๐Ÿ‡ธ๐Ÿ‡ฆ [ุงู„ุนุฑุจูŠุฉ](README.ar.md) | ๐Ÿ‡ฏ๐Ÿ‡ต [ๆ—ฅๆœฌ่ชž](README.ja.md) | ๐Ÿ‡ป๐Ÿ‡ณ [Tiแบฟng Viแป‡t](README.vi.md) | ๐Ÿ‡ง๐Ÿ‡ฌ [ะ‘ัŠะปะณะฐั€ัะบะธ](README.bg.md) | ๐Ÿ‡ฉ๐Ÿ‡ฐ [Dansk](README.da.md) | ๐Ÿ‡ซ๐Ÿ‡ฎ [Suomi](README.fi.md) | ๐Ÿ‡ฎ๐Ÿ‡ฑ [ืขื‘ืจื™ืช](README.he.md) | ๐Ÿ‡ญ๐Ÿ‡บ [Magyar](README.hu.md) | ๐Ÿ‡ฎ๐Ÿ‡ฉ [Bahasa Indonesia](README.id.md) | ๐Ÿ‡ฐ๐Ÿ‡ท [ํ•œ๊ตญ์–ด](README.ko.md) | ๐Ÿ‡ฒ๐Ÿ‡พ [Bahasa Melayu](README.ms.md) | ๐Ÿ‡ณ๐Ÿ‡ฑ [Nederlands](README.nl.md) | ๐Ÿ‡ณ๐Ÿ‡ด [Norsk](README.no.md) | ๐Ÿ‡ต๐Ÿ‡น [Portuguรชs (Portugal)](README.pt.md) | ๐Ÿ‡ท๐Ÿ‡ด [Romรขnฤƒ](README.ro.md) | ๐Ÿ‡ต๐Ÿ‡ฑ [Polski](README.pl.md) | ๐Ÿ‡ธ๐Ÿ‡ฐ [Slovenฤina](README.sk.md) | ๐Ÿ‡ธ๐Ÿ‡ช [Svenska](README.sv.md) | ๐Ÿ‡ต๐Ÿ‡ญ [Filipino](README.phi.md)
--- ## ๐Ÿค” ์™œ OmniRoute์ธ๊ฐ€์š”? **๋ˆ์„ ๋‚ญ๋น„ํ•˜์ง€ ๋ง๊ณ  ํ•œ๋„์— ๋„๋‹ฌํ•˜์ง€ ๋งˆ์„ธ์š”.** - ๊ตฌ๋… ํ• ๋‹น๋Ÿ‰์€ ๋งค๋‹ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ฑ„ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค. - ์†๋„ ์ œํ•œ์œผ๋กœ ์ธํ•ด ์ฝ”๋”ฉ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. - ๊ณ ๊ฐ€์˜ API(๊ณต๊ธ‰์ž๋‹น ์›” $20-50) - ๊ณต๊ธ‰์ž ๊ฐ„ ์ˆ˜๋™ ์ „ํ™˜ **OmniRoute๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.** - โœ… **๊ตฌ๋… ๊ทน๋Œ€ํ™”** - ํ• ๋‹น๋Ÿ‰์„ ์ถ”์ ํ•˜๊ณ  ์žฌ์„ค์ •ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - โœ… **์ž๋™ ๋Œ€์ฒด** - ๊ตฌ๋… โ†’ API ํ‚ค โ†’ ์ €๋ ดํ•œ โ†’ ๋ฌด๋ฃŒ, ๋‹ค์šดํƒ€์ž„ ์—†์Œ - โœ… **๋‹ค์ค‘ ๊ณ„์ •** - ๊ณต๊ธ‰์ž๋ณ„ ๊ณ„์ • ๊ฐ„ ๋ผ์šด๋“œ ๋กœ๋นˆ - โœ… **์œ ๋‹ˆ๋ฒ„์„ค** - Claude Code, Codex, Gemini CLI, Cursor, Cline, OpenClaw, ๋ชจ๋“  CLI ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ --- ## ๐Ÿ”„ ์ž‘๋™ ๋ฐฉ์‹ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Your CLI โ”‚ (Claude Code, Codex, Gemini CLI, OpenClaw, Cursor, Cline...) โ”‚ Tool โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ http://localhost:20128/v1 โ†“ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ OmniRoute (Smart Router) โ”‚ โ”‚ โ€ข Format translation (OpenAI โ†” Claude) โ”‚ โ”‚ โ€ข Quota tracking + Embeddings + Images โ”‚ โ”‚ โ€ข Auto token refresh โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ†’ [Tier 1: SUBSCRIPTION] Claude Code, Codex, Gemini CLI โ”‚ โ†“ quota exhausted โ”œโ”€โ†’ [Tier 2: API KEY] DeepSeek, Groq, xAI, Mistral, NVIDIA NIM, etc. โ”‚ โ†“ budget limit โ”œโ”€โ†’ [Tier 3: CHEAP] GLM ($0.6/1M), MiniMax ($0.2/1M) โ”‚ โ†“ budget limit โ””โ”€โ†’ [Tier 4: FREE] iFlow, Qwen, Kiro (unlimited) Result: Never stop coding, minimal cost ``` --- ## ๐ŸŽฏ What OmniRoute Solves โ€” 16 Real Pain Points > **Every developer using AI tools faces these problems daily.** OmniRoute was built to solve them all โ€” from cost overruns to regional blocks, from broken OAuth flows to zero observability.
๐Ÿ’ธ 1. "I pay for an expensive subscription but still get interrupted by limits" Developers pay $20โ€“200/month for Claude Pro, Codex Pro, or GitHub Copilot. Even paying, quota has a ceiling โ€” 5h of usage, weekly limits, or per-minute rate limits. Mid-coding session, the provider stops responding and the developer loses flow and productivity. **How OmniRoute solves it:** - **Smart 4-Tier Fallback** โ€” If subscription quota runs out, automatically redirects to API Key โ†’ Cheap โ†’ Free with zero manual intervention - **Real-Time Quota Tracking** โ€” Shows token consumption in real-time with reset countdown (5h, daily, weekly) - **Multi-Account Support** โ€” Multiple accounts per provider with auto round-robin โ€” when one runs out, switches to the next - **Custom Combos** โ€” Customizable fallback chains with 6 balancing strategies (fill-first, round-robin, P2C, random, least-used, cost-optimized) - **Codex Business Quotas** โ€” Business/Team workspace quota monitoring directly in the dashboard
๐Ÿ”Œ 2. "I need to use multiple providers but each has a different API" OpenAI uses one format, Claude (Anthropic) uses another, Gemini yet another. If a dev wants to test models from different providers or fallback between them, they need to reconfigure SDKs, change endpoints, deal with incompatible formats. Custom providers (FriendLI, NIM) have non-standard model endpoints. **How OmniRoute solves it:** - **Unified Endpoint** โ€” A single `http://localhost:20128/v1` serves as proxy for all 36+ providers - **Format Translation** โ€” Automatic and transparent: OpenAI โ†” Claude โ†” Gemini โ†” Responses API - **Response Sanitization** โ€” Strips non-standard fields (`x_groq`, `usage_breakdown`, `service_tier`) that break OpenAI SDK v1.83+ - **Role Normalization** โ€” Converts `developer` โ†’ `system` for non-OpenAI providers; `system` โ†’ `user` for GLM/ERNIE - **Think Tag Extraction** โ€” Extracts `` blocks from models like DeepSeek R1 into standardized `reasoning_content` - **Structured Output for Gemini** โ€” `json_schema` โ†’ `responseMimeType`/`responseSchema` automatic conversion - **`stream` defaults to `false`** โ€” Aligns with OpenAI spec, avoiding unexpected SSE in Python/Rust/Go SDKs
๐ŸŒ 3. "My AI provider blocks my region/country" Providers like OpenAI/Codex block access from certain geographic regions. Users get errors like `unsupported_country_region_territory` during OAuth and API connections. This is especially frustrating for developers from developing countries. **How OmniRoute solves it:** - **3-Level Proxy Config** โ€” Configurable proxy at 3 levels: global (all traffic), per-provider (one provider only), and per-connection/key - **Color-Coded Proxy Badges** โ€” Visual indicators: ๐ŸŸข global proxy, ๐ŸŸก provider proxy, ๐Ÿ”ต connection proxy, always showing the IP - **OAuth Token Exchange Through Proxy** โ€” OAuth flow also goes through the proxy, solving `unsupported_country_region_territory` - **Connection Tests via Proxy** โ€” Connection tests use the configured proxy (no more direct bypass) - **SOCKS5 Support** โ€” Full SOCKS5 proxy support for outbound routing - **TLS Fingerprint Spoofing** โ€” Browser-like TLS fingerprint via `wreq-js` to bypass bot detection
๐Ÿ†“ 4. "I want to use AI for coding but I have no money" Not everyone can pay $20โ€“200/month for AI subscriptions. Students, devs from emerging countries, hobbyists, and freelancers need access to quality models at zero cost. **How OmniRoute solves it:** - **Free Tier Providers Built-in** โ€” Native support for 100% free providers: iFlow (8 unlimited models), Qwen (3 unlimited models), Kiro (Claude for free), Gemini CLI (180K/month free) - **Free-Only Combos** โ€” Chain `gc/gemini-3-flash โ†’ if/kimi-k2-thinking โ†’ qw/qwen3-coder-plus` = $0/month with zero downtime - **NVIDIA NIM Free Credits** โ€” 1000 free credits integrated - **Cost Optimized Strategy** โ€” Routing strategy that automatically chooses the cheapest available provider
๐Ÿ”’ 5. "I need to protect my AI gateway from unauthorized access" When exposing an AI gateway to the network (LAN, VPS, Docker), anyone with the address can consume the developer's tokens/quota. Without protection, APIs are vulnerable to misuse, prompt injection, and abuse. **How OmniRoute solves it:** - **API Key Management** โ€” Generation, rotation, and scoping per provider with a dedicated `/dashboard/api-manager` page - **Model-Level Permissions** โ€” Restrict API keys to specific models (`openai/*`, wildcard patterns), with Allow All/Restrict toggle - **API Endpoint Protection** โ€” Require a key for `/v1/models` and block specific providers from the listing - **Auth Guard + CSRF Protection** โ€” All dashboard routes protected with `withAuth` middleware + CSRF tokens - **Rate Limiter** โ€” Per-IP rate limiting with configurable windows - **IP Filtering** โ€” Allowlist/blocklist for access control - **Prompt Injection Guard** โ€” Sanitization against malicious prompt patterns - **AES-256-GCM Encryption** โ€” Credentials encrypted at rest
๐Ÿ›‘ 6. "My provider went down and I lost my coding flow" AI providers can become unstable, return 5xx errors, or hit temporary rate limits. If a dev depends on a single provider, they're interrupted. Without circuit breakers, repeated retries can crash the application. **How OmniRoute solves it:** - **Circuit Breaker per-provider** โ€” Auto-open/close with configurable thresholds and cooldown (Closed/Open/Half-Open) - **Exponential Backoff** โ€” Progressive retry delays - **Anti-Thundering Herd** โ€” Mutex + semaphore protection against concurrent retry storms - **Combo Fallback Chains** โ€” If the primary provider fails, automatically falls through the chain with no intervention - **Combo Circuit Breaker** โ€” Auto-disables failing providers within a combo chain - **Health Dashboard** โ€” Uptime monitoring, circuit breaker states, lockouts, cache stats, p50/p95/p99 latency
๐Ÿ”ง 7. "Configuring each AI tool is tedious and repetitive" Developers use Cursor, Claude Code, Codex CLI, OpenClaw, Gemini CLI, Kilo Code... Each tool needs a different config (API endpoint, key, model). Reconfiguring when switching providers or models is a waste of time. **How OmniRoute solves it:** - **CLI Tools Dashboard** โ€” Dedicated page with one-click setup for Claude Code, Codex CLI, OpenClaw, Kilo Code, Antigravity, Cline - **GitHub Copilot Config Generator** โ€” Generates `chatLanguageModels.json` for VS Code with bulk model selection - **Onboarding Wizard** โ€” Guided 4-step setup for first-time users - **One endpoint, all models** โ€” Configure `http://localhost:20128/v1` once, access 36+ providers
๐Ÿ”‘ 8. "Managing OAuth tokens from multiple providers is hell" Claude Code, Codex, Gemini CLI, Copilot โ€” all use OAuth 2.0 with expiring tokens. Developers need to re-authenticate constantly, deal with `client_secret is missing`, `redirect_uri_mismatch`, and failures on remote servers. OAuth on LAN/VPS is particularly problematic. **How OmniRoute solves it:** - **Auto Token Refresh** โ€” OAuth tokens refresh in background before expiration - **OAuth 2.0 (PKCE) Built-in** โ€” Automatic flow for Claude Code, Codex, Gemini CLI, Copilot, Kiro, Qwen, iFlow - **Multi-Account OAuth** โ€” Multiple accounts per provider via JWT/ID token extraction - **OAuth LAN/Remote Fix** โ€” Private IP detection for `redirect_uri` + manual URL mode for remote servers - **OAuth Behind Nginx** โ€” Uses `window.location.origin` for reverse proxy compatibility - **Remote OAuth Guide** โ€” Step-by-step guide for Google Cloud credentials on VPS/Docker
๐Ÿ“Š 9. "I don't know how much I'm spending or where" Developers use multiple paid providers but have no unified view of spending. Each provider has its own billing dashboard, but there's no consolidated view. Unexpected costs can pile up. **How OmniRoute solves it:** - **Cost Analytics Dashboard** โ€” Per-token cost tracking and budget management per provider - **Budget Limits per Tier** โ€” Spending ceiling per tier that triggers automatic fallback - **Per-Model Pricing Configuration** โ€” Configurable prices per model - **Usage Statistics Per API Key** โ€” Request count and last-used timestamp per key - **Analytics Dashboard** โ€” Stat cards, model usage chart, provider table with success rates and latency
๐Ÿ› 10. "I can't diagnose errors and problems in AI calls" When a call fails, the dev doesn't know if it was a rate limit, expired token, wrong format, or provider error. Fragmented logs across different terminals. Without observability, debugging is trial-and-error. **How OmniRoute solves it:** - **Unified Logs Dashboard** โ€” 4 tabs: Request Logs, Proxy Logs, Audit Logs, Console - **Console Log Viewer** โ€” Real-time terminal-style viewer with color-coded levels, auto-scroll, search, filter - **SQLite Proxy Logs** โ€” Persistent logs that survive server restarts - **Translator Playground** โ€” 4 debugging modes: Playground (format translation), Chat Tester (round-trip), Test Bench (batch), Live Monitor (real-time) - **Request Telemetry** โ€” p50/p95/p99 latency + X-Request-Id tracing - **File-Based Logging with Rotation** โ€” Console interceptor captures everything to JSON log with size-based rotation
๐Ÿ—๏ธ 11. "Deploying and maintaining the gateway is complex" Installing, configuring, and maintaining an AI proxy across different environments (local, VPS, Docker, cloud) is labor-intensive. Problems like hardcoded paths, `EACCES` on directories, port conflicts, and cross-platform builds add friction. **How OmniRoute solves it:** - **npm global install** โ€” `npm install -g omniroute && omniroute` โ€” done - **Docker Multi-Platform** โ€” AMD64 + ARM64 native (Apple Silicon, AWS Graviton, Raspberry Pi) - **Docker Compose Profiles** โ€” `base` (no CLI tools) and `cli` (with Claude Code, Codex, OpenClaw) - **Electron Desktop App** โ€” Native app for Windows/macOS/Linux with system tray, auto-start, offline mode - **Split-Port Mode** โ€” API and Dashboard on separate ports for advanced scenarios (reverse proxy, container networking) - **Cloud Sync** โ€” Config synchronization across devices via Cloudflare Workers - **DB Backups** โ€” Automatic backup, restore, export and import of all settings
๐ŸŒ 12. "The interface is English-only and my team doesn't speak English" Teams in non-English-speaking countries, especially in Latin America, Asia, and Europe, struggle with English-only interfaces. Language barriers reduce adoption and increase configuration errors. **How OmniRoute solves it:** - **Dashboard i18n โ€” 30 Languages** โ€” All 500+ keys translated including Arabic, Bulgarian, Danish, German, Spanish, Finnish, French, Hebrew, Hindi, Hungarian, Indonesian, Italian, Japanese, Korean, Malay, Dutch, Norwegian, Polish, Portuguese (PT/BR), Romanian, Russian, Slovak, Swedish, Thai, Ukrainian, Vietnamese, Chinese, Filipino, English - **RTL Support** โ€” Right-to-left support for Arabic and Hebrew - **Multi-Language READMEs** โ€” 30 complete documentation translations - **Language Selector** โ€” Globe icon in header for real-time switching
๐Ÿ”„ 13. "I need more than chat โ€” I need embeddings, images, audio" AI isn't just chat completion. Devs need to generate images, transcribe audio, create embeddings for RAG, rerank documents, and moderate content. Each API has a different endpoint and format. **How OmniRoute solves it:** - **Embeddings** โ€” `/v1/embeddings` with 6 providers and 9+ models - **Image Generation** โ€” `/v1/images/generations` with 4 providers and 9+ models - **Audio Transcription** โ€” `/v1/audio/transcriptions` โ€” Whisper-compatible - **Text-to-Speech** โ€” `/v1/audio/speech` โ€” Multi-provider audio synthesis - **Moderations** โ€” `/v1/moderations` โ€” Content safety checks - **Reranking** โ€” `/v1/rerank` โ€” Document relevance reranking - **Responses API** โ€” Full `/v1/responses` support for Codex
๐Ÿงช 14. "I have no way to test and compare quality across models" Developers want to know which model is best for their use case โ€” code, translation, reasoning โ€” but comparing manually is slow. No integrated eval tools exist. **How OmniRoute solves it:** - **LLM Evaluations** โ€” Golden set testing with 10 pre-loaded cases covering greetings, math, geography, code generation, JSON compliance, translation, markdown, safety refusal - **4 Match Strategies** โ€” `exact`, `contains`, `regex`, `custom` (JS function) - **Translator Playground Test Bench** โ€” Batch testing with multiple inputs and expected outputs, cross-provider comparison - **Chat Tester** โ€” Full round-trip with visual response rendering - **Live Monitor** โ€” Real-time stream of all requests flowing through the proxy
๐Ÿ“ˆ 15. "I need to scale without losing performance" As request volume grows, without caching the same questions generate duplicate costs. Without idempotency, duplicate requests waste processing. Per-provider rate limits must be respected. **How OmniRoute solves it:** - **Semantic Cache** โ€” Two-tier cache (signature + semantic) reduces cost and latency - **Request Idempotency** โ€” 5s deduplication window for identical requests - **Rate Limit Detection** โ€” Per-provider RPM, min gap, and max concurrent tracking - **Editable Rate Limits** โ€” Configurable defaults in Settings โ†’ Resilience with persistence - **API Key Validation Cache** โ€” 3-tier cache for production performance - **Health Dashboard with Telemetry** โ€” p50/p95/p99 latency, cache stats, uptime
๐Ÿค– 16. "I want to control model behavior globally" Developers who want all responses in a specific language, with a specific tone, or want to limit reasoning tokens. Configuring this in every tool/request is impractical. **How OmniRoute solves it:** - **System Prompt Injection** โ€” Global prompt applied to all requests - **Thinking Budget Validation** โ€” Reasoning token allocation control per request (passthrough, auto, custom, adaptive) - **6 Routing Strategies** โ€” Global strategies that determine how requests are distributed - **Wildcard Router** โ€” `provider/*` patterns route dynamically to any provider - **Combo Enable/Disable Toggle** โ€” Toggle combos directly from the dashboard - **Provider Toggle** โ€” Enable/disable all connections for a provider with one click - **Blocked Providers** โ€” Exclude specific providers from `/v1/models` listing
## โšก ๋น ๋ฅธ ์‹œ์ž‘ **1. ์ „์—ญ์ ์œผ๋กœ ์„ค์น˜:** ```bash npm install -g omniroute omniroute ``` ๐ŸŽ‰ ๋Œ€์‹œ๋ณด๋“œ๋Š” `http://localhost:20128`์—์„œ ์—ด๋ฆฝ๋‹ˆ๋‹ค. | ๋ช…๋ น | ์„ค๋ช… | | ----------------------- | ----------------------------- | | `omniroute` | ์„œ๋ฒ„ ์‹œ์ž‘(๊ธฐ๋ณธ ํฌํŠธ 20128) | | `omniroute --port 3000` | ์‚ฌ์šฉ์ž ์ •์˜ ํฌํŠธ ์‚ฌ์šฉ | | `omniroute --no-open` | ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ž๋™์œผ๋กœ ์—ด์ง€ ์•Š์Œ | | `omniroute --help` | ๋„์›€๋ง ํ‘œ์‹œ | **2. ๋ฌด๋ฃŒ ๊ณต๊ธ‰์ž ์—ฐ๊ฒฐ:** ๋Œ€์‹œ๋ณด๋“œ โ†’ ๊ณต๊ธ‰์ž โ†’ **Claude Code** ๋˜๋Š” **Antigravity** ์—ฐ๊ฒฐ โ†’ OAuth ๋กœ๊ทธ์ธ โ†’ ์™„๋ฃŒ! **3. CLI ๋„๊ตฌ์—์„œ ์‚ฌ์šฉ:** ``` Claude Code/Codex/Gemini CLI/OpenClaw/Cursor/Cline Settings: Endpoint: http://localhost:20128/v1 API Key: [copy from dashboard] Model: if/kimi-k2-thinking ``` **๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค!** ๋ฌด๋ฃŒ AI ๋ชจ๋ธ๋กœ ์ฝ”๋”ฉ์„ ์‹œ์ž‘ํ•ด ๋ณด์„ธ์š”. **๋Œ€์•ˆ โ€” ์†Œ์Šค์—์„œ ์‹คํ–‰:** ```bash cp .env.example .env npm install PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev ``` --- ## ๐Ÿณ ๋„์ปค OmniRoute๋Š” [Docker Hub](https://hub.docker.com/r/diegosouzapw/omniroute)์—์„œ ๊ณต๊ฐœ Docker ์ด๋ฏธ์ง€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. **๋น ๋ฅธ ์‹คํ–‰:** ```bash docker run -d \ --name omniroute \ --restart unless-stopped \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest ``` **ํ™˜๊ฒฝ ํŒŒ์ผ ํฌํ•จ:** ```bash # Copy and edit .env first cp .env.example .env docker run -d \ --name omniroute \ --restart unless-stopped \ --env-file .env \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest ``` **Docker Compose ์‚ฌ์šฉ:** ```bash # Base profile (no CLI tools) docker compose --profile base up -d # CLI profile (Claude Code, Codex, OpenClaw built-in) docker compose --profile cli up -d ``` | ์ด๋ฏธ์ง€ | ํƒœ๊ทธ | ์‚ฌ์ด์ฆˆ | ์„ค๋ช… | | ------------------------ | -------- | ------ | ---------------- | | `diegosouzapw/omniroute` | `latest` | ~250MB | ์ตœ์‹  ์•ˆ์ • ๋ฆด๋ฆฌ์Šค | | `diegosouzapw/omniroute` | `1.0.3` | ~250MB | ํ˜„์žฌ ๋ฒ„์ „ | --- --- ## ๐Ÿ–ฅ๏ธ ๋ฐ์Šคํฌํ†ฑ ์•ฑ โ€” ์˜คํ”„๋ผ์ธ & ์ƒ์‹œ ๊ฐ€๋™ > ๐Ÿ†• **์ƒˆ ๊ธฐ๋Šฅ!** OmniRoute๊ฐ€ Windows, macOS, Linux์šฉ **๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ์Šคํฌํ†ฑ ์•ฑ**์œผ๋กœ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. - ๐Ÿ–ฅ๏ธ **๋„ค์ดํ‹ฐ๋ธŒ ์œˆ๋„์šฐ** โ€” ์‹œ์Šคํ…œ ํŠธ๋ ˆ์ด ํ†ตํ•ฉ ์ „์šฉ ์ฐฝ - ๐Ÿ”„ **์ž๋™ ์‹œ์ž‘** โ€” ์‹œ์Šคํ…œ ๋กœ๊ทธ์ธ ์‹œ OmniRoute ์‹คํ–‰ - ๐Ÿ”” **๋„ค์ดํ‹ฐ๋ธŒ ์•Œ๋ฆผ** โ€” ํ• ๋‹น๋Ÿ‰ ์†Œ์ง„ ๋˜๋Š” ๊ณต๊ธ‰์ž ๋ฌธ์ œ ์•Œ๋ฆผ - โšก **์›ํด๋ฆญ ์„ค์น˜** โ€” NSIS (Windows), DMG (macOS), AppImage (Linux) - ๐ŸŒ **์˜คํ”„๋ผ์ธ ๋ชจ๋“œ** โ€” ๋‚ด์žฅ ์„œ๋ฒ„๋กœ ์™„์ „ ์˜คํ”„๋ผ์ธ ์ž‘๋™ ```bash npm run electron:dev # ๊ฐœ๋ฐœ ๋ชจ๋“œ npm run electron:build # ํ˜„์žฌ ํ”Œ๋žซํผ npm run electron:build:win # Windows (.exe) npm run electron:build:mac # macOS (.dmg) npm run electron:build:linux # Linux (.AppImage) ``` ๐Ÿ“– ์ „์ฒด ๋ฌธ์„œ: [`electron/README.md`](electron/README.md) --- ## ๐Ÿ’ฐ ๊ฐ€๊ฒฉ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ | ๊ณ„์ธต | ๊ณต๊ธ‰์ž | ๋น„์šฉ | ํ• ๋‹น๋Ÿ‰ ์žฌ์„ค์ • | ์ตœ๊ณ ์˜ ๋Œ€์ƒ | | ------------- | ------------------- | --------------------- | --------------- | ----------------- | | **๐Ÿ’ณ ๊ตฌ๋…** | ํด๋กœ๋“œ ์ฝ”๋“œ (Pro) | $20/์›” | 5์‹œ๊ฐ„ + ๋งค์ฃผ | ์ด๋ฏธ ๊ตฌ๋… ์ค‘ | | | ์ฝ”๋ฑ์Šค(ํ”Œ๋Ÿฌ์Šค/ํ”„๋กœ) | $20-200/์›” | 5์‹œ๊ฐ„ + ๋งค์ฃผ | OpenAI ์‚ฌ์šฉ์ž | | | ์ œ๋ฏธ๋‹ˆ CLI | **๋ฌด๋ฃŒ** | 180K/์›” + 1K/์ผ | ๋ชจ๋“  ์‚ฌ๋žŒ! | | | GitHub ๋ถ€์กฐ์ข…์‚ฌ | $10-19/์›” | ์›”๊ฐ„ | GitHub ์‚ฌ์šฉ์ž | | **๐Ÿ”‘ API ํ‚ค** | ์—”๋น„๋””์•„ NIM | **๋ฌด๋ฃŒ** (1000ํฌ๋ ˆ๋”ง) | ์ผํšŒ์„ฑ | ๋ฌด๋ฃŒ ๋“ฑ๊ธ‰ ํ…Œ์ŠคํŠธ | | | ๋”ฅ์‹œํฌ | ์ข…๋Ÿ‰์ œ | ์—†์Œ | ์ตœ๊ณ ์˜ ๊ฐ€๊ฒฉ/ํ’ˆ์งˆ | | | ๊ทธ๋กœํฌ | ๋ฌด๋ฃŒ ๋“ฑ๊ธ‰ + ์œ ๋ฃŒ | ์š”๊ธˆ ์ œํ•œ | ์ดˆ๊ณ ์† ์ถ”๋ก  | | | xAI(๊ทธ๋ก) | ์ข…๋Ÿ‰์ œ | ์—†์Œ | ๊ทธ๋ก ๋ชจ๋ธ | | | ๋ฏธ์ŠคํŠธ๋ž„ | ๋ฌด๋ฃŒ ๋“ฑ๊ธ‰ + ์œ ๋ฃŒ | ์š”๊ธˆ ์ œํ•œ | ์œ ๋Ÿฝ์˜ AI | | | ์˜คํ”ˆ๋ผ์šฐํ„ฐ | ์ข…๋Ÿ‰์ œ | ์—†์Œ | 100๊ฐœ ์ด์ƒ์˜ ๋ชจ๋ธ | | **๐Ÿ’ฐ ์ €๋ ดํ•œ** | GLM-4.7 | $0.6/1M | ๋งค์ผ ์˜ค์ „ 10์‹œ | ์˜ˆ์‚ฐ ๋ฐฑ์—… | | | ๋ฏธ๋‹ˆ๋งฅ์Šค M2.1 | $0.2/1M | 5์‹œ๊ฐ„ ๋กค๋ง | ๊ฐ€์žฅ ์ €๋ ดํ•œ ์˜ต์…˜ | | | ํ‚ค๋ฏธ K2 | $9/์›” ์ •์•ก | 1000๋งŒ ํ† ํฐ/์›” | ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋น„์šฉ | | **๐Ÿ†“ ๋ฌด๋ฃŒ** | ์•„์ดํ”Œ๋กœ์šฐ | $0 | ๋ฌด์ œํ•œ | 8๊ฐœ ๋ชจ๋ธ ๋ฌด๋ฃŒ | | | ํ€€ | $0 | ๋ฌด์ œํ•œ | 3๊ฐœ ๋ชจ๋ธ ๋ฌด๋ฃŒ | | | ํ‚ค๋กœ | $0 | ๋ฌด์ œํ•œ | ํด๋กœ๋“œ ํ”„๋ฆฌ | **๐Ÿ’ก ์ „๋ฌธ๊ฐ€ ํŒ:** Gemini CLI(์›” 180K ๋ฌด๋ฃŒ) + iFlow(๋ฌด์ œํ•œ ๋ฌด๋ฃŒ) ์ฝค๋ณด = ๋น„์šฉ $0๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”! --- ## ๐Ÿ’ก ์ฃผ์š” ๊ธฐ๋Šฅ ### ๐Ÿง  ์ฝ”์–ด ๋ผ์šฐํŒ… ๋ฐ ์ธํ…”๋ฆฌ์ „์Šค | ๊ธฐ๋Šฅ | ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ | | ----------------------------- | ----------------------------------------------------------------------------- | | ๐ŸŽฏ **์Šค๋งˆํŠธ 4๊ณ„์ธต ํด๋ฐฑ** | ์ž๋™ ๊ฒฝ๋กœ: ๊ตฌ๋… โ†’ API ํ‚ค โ†’ ์ €๋ ดํ•œ โ†’ ๋ฌด๋ฃŒ | | ๐Ÿ“Š **์‹ค์‹œ๊ฐ„ ํ• ๋‹น๋Ÿ‰ ์ถ”์ ** | ๋ผ์ด๋ธŒ ํ† ํฐ ์ˆ˜ + ๊ณต๊ธ‰์ž๋ณ„ ์นด์šดํŠธ๋‹ค์šด ์žฌ์„ค์ • | | ๐Ÿ”„ **ํ˜•์‹ ๋ฒˆ์—ญ** | OpenAI โ‡” Claude โ‡” Gemini โ‡” Cursor โ‡” Kiro ์‹ฌ๋ฆฌ์Šค + ๋ฐ˜์‘์œ„์ƒ | | ๐Ÿ‘ฅ **๋‹ค์ค‘ ๊ณ„์ • ์ง€์›** | ์ง€๋Šฅ์ ์ธ ์„ ํƒ์„ ํ†ตํ•ด ๊ณต๊ธ‰์ž๋‹น ์—ฌ๋Ÿฌ ๊ณ„์ • | | ๐Ÿ”„ **์ž๋™ ํ† ํฐ ์ƒˆ๋กœ๊ณ ์นจ** | ์žฌ์‹œ๋„ ์‹œ OAuth ํ† ํฐ์ด ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์ณ์ง‘๋‹ˆ๋‹ค. | | ๐ŸŽจ **๋งž์ถคํ˜• ์ฝค๋ณด** | 6๊ฐ€์ง€ ์ „๋žต: ์ฑ„์šฐ๊ธฐ ์šฐ์„ , ๋ผ์šด๋“œ ๋กœ๋นˆ, p2c, ๋ฌด์ž‘์œ„, ์ตœ์†Œ ์‚ฌ์šฉ, ๋น„์šฉ ์ตœ์ ํ™” | | ๐Ÿงฉ **๋งž์ถคํ˜• ๋ชจ๋ธ** | ๋ชจ๋“  ๊ณต๊ธ‰์ž์— ๋ชจ๋ธ ID ์ถ”๊ฐ€ | | ๐ŸŒ **์™€์ผ๋“œ์นด๋“œ ๋ผ์šฐํ„ฐ** | `provider/*` ํŒจํ„ด์„ ๋ชจ๋“  ๊ณต๊ธ‰์ž์—๊ฒŒ ๋™์ ์œผ๋กœ ๋ผ์šฐํŒ… | | ๐Ÿง  **์˜ˆ์‚ฐ ๊ณ ๋ ค** | ์ถ”๋ก  ๋ชจ๋ธ์„ ์œ„ํ•œ ํŒจ์Šค์Šค๋ฃจ, ์ž๋™, ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ ์ ์‘ํ˜• ๋ชจ๋“œ | | ๐Ÿ”€ **Model Aliases** | Auto-forward deprecated model IDs to current replacements (built-in + custom) | | โšก **Background Degradation** | Auto-route background tasks (titles, summaries) to cheaper models | | ๐Ÿ’ฌ **์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์‚ฝ์ž…** | ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹์ „์—ญ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์ ์šฉ | | ๐Ÿ“„ **์‘๋‹ต API** | Codex์— ๋Œ€ํ•œ ์ „์ฒด OpenAI ์‘๋‹ต API(`/v1/responses`) ์ง€์› | ### ๐ŸŽต ๋‹ค์ค‘ ๋ชจ๋“œ API | ๊ธฐ๋Šฅ | ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ | | ----------------------- | ------------------------------------------------------ | | ๐Ÿ–ผ๏ธ **์ด๋ฏธ์ง€ ์ƒ์„ฑ** | `/v1/images/generations` โ€” 4๊ฐœ ๊ณต๊ธ‰์ž, 9๊ฐœ ์ด์ƒ์˜ ๋ชจ๋ธ | | ๐Ÿ“ **์ž„๋ฒ ๋”ฉ** | `/v1/embeddings` โ€” 6๊ฐœ ๊ณต๊ธ‰์ž, 9๊ฐœ ์ด์ƒ์˜ ๋ชจ๋ธ | | ๐ŸŽค **์˜ค๋””์˜ค ์ „์‚ฌ** | `/v1/audio/transcriptions` โ€” ์†์‚ญ์ž„ ํ˜ธํ™˜ | | ๐Ÿ”Š **ํ…์ŠคํŠธ ์Œ์„ฑ ๋ณ€ํ™˜** | `/v1/audio/speech` โ€” ๋‹ค์ค‘ ์ œ๊ณต์ž ์˜ค๋””์˜ค ํ•ฉ์„ฑ | | ๐Ÿ›ก๏ธ **์กฐ์ •** | `/v1/moderations` โ€” ์ฝ˜ํ…์ธ  ์•ˆ์ „ ํ™•์ธ | | ๐Ÿ”€ **์žฌ์ˆœ์œ„** | `/v1/rerank` โ€” ๋ฌธ์„œ ๊ด€๋ จ์„ฑ ์žฌ์ˆœ์œ„ | ### ๐Ÿ›ก๏ธ ๋ณต์›๋ ฅ ๋ฐ ๋ณด์•ˆ | ๊ธฐ๋Šฅ | ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ | | ------------------------------- | ---------------------------------------------------------------------------- | | ๐Ÿ”Œ **ํšŒ๋กœ ์ฐจ๋‹จ๊ธฐ** | ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์ž„๊ณ„๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ธ‰์ž๋ณ„ ์ž๋™ ์—ด๊ธฐ/๋‹ซ๊ธฐ | | ๐Ÿ›ก๏ธ **์ฒœ๋‘ฅ ๋ฐฉ์ง€ ๋ฌด๋ฆฌ** | API ํ‚ค ๊ณต๊ธ‰์ž์— ๋Œ€ํ•œ ๋ฎคํ…์Šค + ์„ธ๋งˆํฌ ์†๋„ ์ œํ•œ | | ๐Ÿง  **์˜๋ฏธ๋ก ์  ์บ์‹œ** | 2๊ณ„์ธต ์บ์‹œ(์„œ๋ช… + ์˜๋ฏธ ์ฒด๊ณ„)๋กœ ๋น„์šฉ ๋ฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ฐ์†Œ | | โšก **๋ฉฑ๋“ฑ์„ฑ ์š”์ฒญ** | ์ค‘๋ณต ์š”์ฒญ์— ๋Œ€ํ•œ 5์ดˆ ์ค‘๋ณต ์ œ๊ฑฐ ๊ธฐ๊ฐ„ | | ๐Ÿ”’ **TLS ์ง€๋ฌธ ์Šคํ‘ธํ•‘** | wreq-js๋ฅผ ํ†ตํ•ด TLS ๊ธฐ๋ฐ˜ ๋ด‡ ๊ฐ์ง€ ์šฐํšŒ | | ๐ŸŒ **IP ํ•„ํ„ฐ๋ง** | API ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ์œ„ํ•œ ํ—ˆ์šฉ ๋ชฉ๋ก/์ฐจ๋‹จ ๋ชฉ๋ก | | ๐Ÿ“Š **ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ์†๋„ ์ œํ•œ** | ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ RPM, ์ตœ์†Œ ๊ฐ„๊ฒฉ ๋ฐ ์ตœ๋Œ€ ๋™์‹œ | | ๐Ÿ’พ **Rate Limit Persistence** | Learned limits survive restarts via SQLite with 60s debounce + 24h staleness | | ๐Ÿ”„ **Token Refresh Resilience** | Per-provider circuit breaker (5 failsโ†’30min) + 30s timeout per attempt | | ๐Ÿ›ก **API ์—”๋“œํฌ์ธํŠธ ๋ณดํ˜ธ** | `/models` ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ธ์ฆ ๊ฒŒ์ดํŒ… + ๊ณต๊ธ‰์ž ์ฐจ๋‹จ | | ๐Ÿ”’ **ํ”„๋ก์‹œ ๊ฐ€์‹œ์„ฑ** | ์ƒ‰์ƒ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋ฐฐ์ง€: ๐ŸŸข ๊ธ€๋กœ๋ฒŒ, ๐ŸŸก ๊ณต๊ธ‰์ž, ๐Ÿ”ต IP ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ํ†ตํ•œ ์—ฐ๊ฒฐ๋ณ„ | | ๐ŸŒ **3๋‹จ๊ณ„ ํ”„๋ก์‹œ ๊ตฌ์„ฑ** | ๊ธ€๋กœ๋ฒŒ, ๊ณต๊ธ‰์ž๋ณ„ ๋˜๋Š” ์—ฐ๊ฒฐ๋ณ„ ์ˆ˜์ค€์—์„œ ํ”„๋ก์‹œ ๊ตฌ์„ฑ | ### ๐Ÿ“Š ๊ด€์ฐฐ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ๋ถ„์„ | ๊ธฐ๋Šฅ | ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ | | ------------------------- | -------------------------------------------------------------------- | | ๐Ÿ“ **๋กœ๊น… ์š”์ฒญ** | ์ „์ฒด ์š”์ฒญ/์‘๋‹ต ๋กœ๊ทธ๊ฐ€ ํฌํ•จ๋œ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ | | ๐Ÿ’พ **SQLite ํ”„๋ก์‹œ ๋กœ๊ทธ** | ์˜๊ตฌ ํ”„๋ก์‹œ ๋กœ๊ทธ๋Š” ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. | | ๐Ÿ“Š **๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ** | Recharts ๊ธฐ๋ฐ˜: ํ†ต๊ณ„ ์นด๋“œ, ๋ชจ๋ธ ์‚ฌ์šฉ ์ฐจํŠธ, ๊ณต๊ธ‰์ž ํ…Œ์ด๋ธ” | | ๐Ÿ“ˆ **์ง„ํ–‰ ์ƒํ™ฉ ์ถ”์ ** | ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์œ„ํ•œ ์˜ตํŠธ์ธ SSE ์ง„ํ–‰ ์ด๋ฒคํŠธ | | ๐Ÿงช **LLM ํ‰๊ฐ€** | 4๊ฐ€์ง€ ๋งค์น˜ ์ „๋žต์„ ์‚ฌ์šฉํ•œ ๊ณจ๋“  ์„ธํŠธ ํ…Œ์ŠคํŠธ | | ๐Ÿ” **์›๊ฒฉ ์ธก์ • ์š”์ฒญ** | p50/p95/p99 ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ง‘๊ณ„ + X-์š”์ฒญ-ID ์ถ”์  | | ๐Ÿ“‹ **๋กœ๊ทธ ๋Œ€์‹œ๋ณด๋“œ** | ํ†ตํ•ฉ๋œ 4๊ฐœ ํƒญ ํŽ˜์ด์ง€: ์š”์ฒญ ๋กœ๊ทธ, ํ”„๋ก์‹œ ๋กœ๊ทธ, ๊ฐ์‚ฌ ๋กœ๊ทธ, ์ฝ˜์†” | | ๐Ÿ–ฅ๏ธ **์ฝ˜์†” ๋กœ๊ทธ ๋ทฐ์–ด** | ๋ ˆ๋ฒจ ํ•„ํ„ฐ, ๊ฒ€์ƒ‰, ์ž๋™ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์‹ค์‹œ๊ฐ„ ํ„ฐ๋ฏธ๋„ ์Šคํƒ€์ผ ๋ทฐ์–ด | | ๐Ÿ“‘ **ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋กœ๊น…** | ์ฝ˜์†” ์ธํ„ฐ์…‰ํ„ฐ๋Š” ํšŒ์ „์„ ํ†ตํ•ด ๋ชจ๋“  ์ถœ๋ ฅ์„ JSON ๋กœ๊ทธ ํŒŒ์ผ๋กœ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. | | ๐Ÿฅ **๊ฑด๊ฐ• ๋Œ€์‹œ๋ณด๋“œ** | ์‹œ์Šคํ…œ ๊ฐ€๋™ ์‹œ๊ฐ„, ํšŒ๋กœ ์ฐจ๋‹จ๊ธฐ ์ƒํƒœ, ์ž ๊ธˆ, ์บ์‹œ ํ†ต๊ณ„ | | ๐Ÿ’ฐ **๋น„์šฉ ์ถ”์ ** | ์˜ˆ์‚ฐ ๊ด€๋ฆฌ + ๋ชจ๋ธ๋ณ„ ๊ฐ€๊ฒฉ ๊ตฌ์„ฑ | ### โ˜๏ธ ๋ฐฐํฌ ๋ฐ ๋™๊ธฐํ™” | ๊ธฐ๋Šฅ | ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ | | ---------------------------------- | ----------------------------------------------------------------- | | ๐Ÿ’พ **ํด๋ผ์šฐ๋“œ ๋™๊ธฐํ™”** | Cloudflare Workers๋ฅผ ํ†ตํ•ด ์žฅ์น˜ ๊ฐ„ ๊ตฌ์„ฑ ๋™๊ธฐํ™” | | ๐ŸŒ **์–ด๋””์„œ๋‚˜ ๋ฐฐํฌ** | ๋กœ์ปฌํ˜ธ์ŠคํŠธ, VPS, Docker, Cloudflare ์ž‘์—…์ž | | ๐Ÿ”‘ **API ํ‚ค ๊ด€๋ฆฌ** | ๊ณต๊ธ‰์ž๋ณ„ API ํ‚ค ์ƒ์„ฑ, ํšŒ์ „ ๋ฐ ๋ฒ”์œ„ ์ง€์ • | | ๐Ÿง™ **์˜จ๋ณด๋”ฉ ๋งˆ๋ฒ•์‚ฌ** | ์ฒ˜์Œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ 4๋‹จ๊ณ„ ์•ˆ๋‚ด ์„ค์ • | | ๐Ÿ”ง **CLI ๋„๊ตฌ ๋Œ€์‹œ๋ณด๋“œ** | ์›ํด๋ฆญ ๊ตฌ์„ฑ Claude, Codex, Cline, OpenClaw, Kilo, Antigravity | | ๐Ÿ”„ **DB ๋ฐฑ์—…** | ๋ชจ๋“  ์„ค์ •์— ๋Œ€ํ•œ ์ž๋™ ๋ฐฑ์—…, ๋ณต์›, ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ | | ๐ŸŒ **๊ตญ์ œํ™”** | next-intl์ด ํฌํ•จ๋œ ์ „์ฒด i18n โ€” ์˜์–ด + ํฌ๋ฅดํˆฌ๊ฐˆ์–ด(๋ธŒ๋ผ์งˆ) ์ง€์› | | ๐ŸŒ **์–ธ์–ด ์„ ํƒ๊ธฐ** | ์‹ค์‹œ๊ฐ„ ์–ธ์–ด ์ „ํ™˜์„ ์œ„ํ•œ ํ—ค๋”์˜ ์ง€๊ตฌ๋ณธ ์•„์ด์ฝ˜(๐Ÿ‡บ๐Ÿ‡ธ/๐Ÿ‡ง๐Ÿ‡ท) | | ๐Ÿ“‚ **์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ** | `DATA_DIR` env var๋Š” ๊ธฐ๋ณธ `~/.omniroute` ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค |
๐Ÿ“– ๊ธฐ๋Šฅ ์„ธ๋ถ€์ •๋ณด ### ๐ŸŽฏ ์Šค๋งˆํŠธ 4๊ณ„์ธต ํด๋ฐฑ ์ž๋™ ๋Œ€์ฒด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝค๋ณด ๋งŒ๋“ค๊ธฐ: ``` Combo: "my-coding-stack" 1. cc/claude-opus-4-6 (your subscription) 2. nvidia/llama-3.3-70b (free NVIDIA API) 3. glm/glm-4.7 (cheap backup, $0.6/1M) 4. if/kimi-k2-thinking (free fallback) โ†’ Auto switches when quota runs out or errors occur ``` ### ๐Ÿ“Š ์‹ค์‹œ๊ฐ„ ํ• ๋‹น๋Ÿ‰ ์ถ”์  - ์ œ๊ณต์ž๋ณ„ ํ† ํฐ ์†Œ๋น„ - ์นด์šดํŠธ๋‹ค์šด ์žฌ์„ค์ •(5์‹œ๊ฐ„, ๋งค์ผ, ๋งค์ฃผ) - ์œ ๋ฃŒ ๊ณ„์ธต์— ๋Œ€ํ•œ ๋น„์šฉ ์ถ”์ • - ์›”๋ณ„ ์ง€์ถœ ๋ณด๊ณ ์„œ ### ๐Ÿ”„ ํ˜•์‹ ๋ฒˆ์—ญ ํ˜•์‹ ๊ฐ„ ์›ํ™œํ•œ ๋ฒˆ์—ญ: - **OpenAI** โ† **Claude** โ† **Gemini** โ† **OpenAI ์‘๋‹ต** - CLI ๋„๊ตฌ๊ฐ€ OpenAI ํ˜•์‹ ์ „์†ก โ†’ OmniRoute ๋ณ€ํ™˜ โ†’ ๊ณต๊ธ‰์ž๊ฐ€ ๊ธฐ๋ณธ ํ˜•์‹ ์ˆ˜์‹  - ๋งž์ถคํ˜• OpenAI ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ - **์‘๋‹ต ์‚ญ์ œ** โ€” ์—„๊ฒฉํ•œ OpenAI SDK ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋น„ํ‘œ์ค€ ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. - **์—ญํ•  ์ •๊ทœํ™”** โ€” OpenAI๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ `developer` โ†’ `system`; `system` โ†’ GLM/ERNIE ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ `user` - **์‚ฌ๊ณ  ํƒœ๊ทธ ์ถ”์ถœ** โ€” ์‚ฌ๊ณ  ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ `` ๋ธ”๋ก โ†’ `reasoning_content` - **๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ** โ€” `json_schema` โ†’ Gemini์˜ `responseMimeType`/`responseSchema` ### ๐Ÿ‘ฅ ๋‹ค์ค‘ ๊ณ„์ • ์ง€์› - ๊ณต๊ธ‰์ž๋‹น ์—ฌ๋Ÿฌ ๊ณ„์ • ์ถ”๊ฐ€ - ์ž๋™ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋˜๋Š” ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… - ํ•œ ๊ณ„์ •์ด ํ• ๋‹น๋Ÿ‰์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์Œ ๊ณ„์ •์œผ๋กœ ๋Œ€์ฒด ### ๐Ÿ”„ ์ž๋™ ํ† ํฐ ์ƒˆ๋กœ๊ณ ์นจ - OAuth ํ† ํฐ์€ ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์— ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์ณ์ง‘๋‹ˆ๋‹ค. - ์ˆ˜๋™ ์žฌ์ธ์ฆ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ๋ชจ๋“  ์ œ๊ณต์—…์ฒด์— ๊ฑธ์นœ ์›ํ™œํ•œ ๊ฒฝํ—˜ ### ๐ŸŽจ ๋งž์ถค ์ฝค๋ณด - ๋ฌด์ œํ•œ ๋ชจ๋ธ ์กฐํ•ฉ ์ƒ์„ฑ - 6๊ฐ€์ง€ ์ „๋žต: ์ฑ„์šฐ๊ธฐ ์šฐ์„ , ๋ผ์šด๋“œ ๋กœ๋นˆ, ๋‘ ๊ฐ€์ง€ ์„ ํƒ์˜ ํž˜, ๋ฌด์ž‘์œ„, ์ตœ์†Œ ์‚ฌ์šฉ, ๋น„์šฉ ์ตœ์ ํ™” - Cloud Sync๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ์—์„œ ์ฝค๋ณด๋ฅผ ๊ณต์œ ํ•˜์„ธ์š” ### ๐Ÿฅ ๊ฑด๊ฐ• ๋Œ€์‹œ๋ณด๋“œ - ์‹œ์Šคํ…œ ์ƒํƒœ(๊ฐ€๋™ ์‹œ๊ฐ„, ๋ฒ„์ „, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰) - ๊ณต๊ธ‰์ž๋ณ„ ํšŒ๋กœ ์ฐจ๋‹จ๊ธฐ ์ƒํƒœ(Closed/Open/Half-Open) - ์†๋„ ์ œํ•œ ์ƒํƒœ ๋ฐ ํ™œ์„ฑ ์ž ๊ธˆ - ์„œ๋ช… ์บ์‹œ ํ†ต๊ณ„ - ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์›๊ฒฉ ์ธก์ •(p50/p95/p99) + ํ”„๋กฌํ”„ํŠธ ์บ์‹œ - ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์œผ๋กœ ๊ฑด๊ฐ• ์ƒํƒœ ์žฌ์„ค์ • ### ๐Ÿ”ง ๋ฒˆ์—ญ๊ธฐ ๋†€์ดํ„ฐ OmniRoute์—๋Š” API ๋ฒˆ์—ญ ๋””๋ฒ„๊น…, ํ…Œ์ŠคํŠธ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ **4๊ฐ€์ง€ ๋ชจ๋“œ**๋ฅผ ๊ฐ–์ถ˜ ๊ฐ•๋ ฅํ•œ ๋‚ด์žฅ ๋ฒˆ์—ญ๊ธฐ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. | ๋ชจ๋“œ | ์„ค๋ช… | | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **๐Ÿ’ป ๋†€์ดํ„ฐ** | ์ง์ ‘ ํ˜•์‹ ๋ณ€ํ™˜ โ€” API ์š”์ฒญ ๋ณธ๋ฌธ์„ ๋ถ™์—ฌ๋„ฃ๊ณ  OmniRoute๊ฐ€ ๊ณต๊ธ‰์ž ํ˜•์‹(OpenAI โ† Claude โ† Gemini โ† Responses API) ๊ฐ„์— ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š”์ง€ ์ฆ‰์‹œ ํ™•์ธํ•˜์„ธ์š”. ์˜ˆ์ œ ํ…œํ”Œ๋ฆฟ๊ณผ ํ˜•์‹ ์ž๋™ ๊ฐ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. | | **๐Ÿ’ฌ ์ฑ„ํŒ… ํ…Œ์Šคํ„ฐ** | OmniRoute๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์ฑ„ํŒ… ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์ „์ฒด ์™•๋ณต(์ž…๋ ฅ, ๋ฒˆ์—ญ๋œ ์š”์ฒญ, ๊ณต๊ธ‰์ž ์‘๋‹ต, ๋ฒˆ์—ญ๋œ ์‘๋‹ต)์„ ํ™•์ธํ•˜์„ธ์š”. ์ฝค๋ณด ๋ผ์šฐํŒ…์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. | | **๐Ÿงช ํ…Œ์ŠคํŠธ ๋ฒค์น˜** | ๋ฐฐ์น˜ ํ…Œ์ŠคํŠธ ๋ชจ๋“œ โ€” ์„œ๋กœ ๋‹ค๋ฅธ ์ž…๋ ฅ๊ณผ ์˜ˆ์ƒ ์ถœ๋ ฅ์œผ๋กœ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ๋ชจ๋‘ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•˜๊ณ , ๊ณต๊ธ‰์ž์™€ ๋ชจ๋ธ ๊ฐ„์— ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. | | **๐Ÿ“ฑ ๋ผ์ด๋ธŒ ๋ชจ๋‹ˆํ„ฐ** | ์‹ค์‹œ๊ฐ„ ์š”์ฒญ ๋ชจ๋‹ˆํ„ฐ๋ง โ€” OmniRoute๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๊ฐ์‹œํ•˜๊ณ , ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ํ˜•์‹ ๋ณ€ํ™˜์„ ํ™•์ธํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ์ฆ‰์‹œ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. | **์•ก์„ธ์Šค:** ๋Œ€์‹œ๋ณด๋“œ โ†’ ๋ฒˆ์—ญ๊ธฐ(์‚ฌ์ด๋“œ๋ฐ”) ### ๐Ÿ’พ ํด๋ผ์šฐ๋“œ ๋™๊ธฐํ™” - ์—ฌ๋Ÿฌ ์žฅ์น˜์—์„œ ๊ณต๊ธ‰์ž, ์ฝค๋ณด ๋ฐ ์„ค์ •์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. - ์ž๋™ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™๊ธฐํ™” - ์•ˆ์ „ํ•œ ์•”ํ˜ธํ™” ์ €์žฅ
--- ## ๐ŸŽฏ ์‚ฌ์šฉ ์‚ฌ๋ก€ ### ์‚ฌ๋ก€ 1: "Claude Pro๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค." **๋ฌธ์ œ:** ํ• ๋‹น๋Ÿ‰์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋งŒ๋ฃŒ๋˜๋ฉฐ, ์ฝ”๋”ฉ ์ž‘์—…์ด ๋งŽ์€ ๋™์•ˆ ์†๋„ ์ œํ•œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ``` Combo: "maximize-claude" 1. cc/claude-opus-4-6 (use subscription fully) 2. glm/glm-4.7 (cheap backup when quota out) 3. if/kimi-k2-thinking (free emergency fallback) Monthly cost: $20 (subscription) + ~$5 (backup) = $25 total vs. $20 + hitting limits = frustration ``` ### ์‚ฌ๋ก€ 2: "๋น„์šฉ์ด 0์ด๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค" **๋ฌธ์ œ:** ๊ตฌ๋…๋ฃŒ๋ฅผ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†๊ณ  ์•ˆ์ •์ ์ธ AI ์ฝ”๋”ฉ์ด ํ•„์š”ํ•จ ``` Combo: "free-forever" 1. gc/gemini-3-flash (180K free/month) 2. if/kimi-k2-thinking (unlimited free) 3. qw/qwen3-coder-plus (unlimited free) Monthly cost: $0 Quality: Production-ready models ``` ### ์‚ฌ๋ก€ 3: "์ค‘๋‹จ ์—†์ด ์—ฐ์ค‘๋ฌดํœด ์ฝ”๋”ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค." **๋ฌธ์ œ:** ๋งˆ๊ฐ์ผ, ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†์Œ ``` Combo: "always-on" 1. cc/claude-opus-4-6 (best quality) 2. cx/gpt-5.2-codex (second subscription) 3. glm/glm-4.7 (cheap, resets daily) 4. minimax/MiniMax-M2.1 (cheapest, 5h reset) 5. if/kimi-k2-thinking (free unlimited) Result: 5 layers of fallback = zero downtime ``` ### ์‚ฌ๋ก€ 4: "OpenClaw์—์„œ ๋ฌด๋ฃŒ AI๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค" **๋ฌธ์ œ:** ๋ฉ”์‹œ์ง• ์•ฑ์— AI ๋„์šฐ๋ฏธ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์™„์ „ ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค. ``` Combo: "openclaw-free" 1. if/glm-4.7 (unlimited free) 2. if/minimax-m2.1 (unlimited free) 3. if/kimi-k2-thinking (unlimited free) Monthly cost: $0 Access via: WhatsApp, Telegram, Slack, Discord, iMessage, Signal... ``` --- ## ๐Ÿ“– ์„ค์ • ๊ฐ€์ด๋“œ
๐Ÿ’ณ ๊ตฌ๋… ์ œ๊ณต์—…์ฒด ### ํด๋กœ๋“œ ์ฝ”๋“œ(Pro/Max) ```bash Dashboard โ†’ Providers โ†’ Connect Claude Code โ†’ OAuth login โ†’ Auto token refresh โ†’ 5-hour + weekly quota tracking Models: cc/claude-opus-4-6 cc/claude-sonnet-4-5-20250929 cc/claude-haiku-4-5-20251001 ``` **ํ”„๋กœ ํŒ:** ๋ณต์žกํ•œ ์ž‘์—…์—๋Š” Opus๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์†๋„๋ฅผ ๋†’์ด๋ ค๋ฉด Sonnet์„ ์‚ฌ์šฉํ•˜์„ธ์š”. OmniRoute๋Š” ๋ชจ๋ธ๋‹น ํ• ๋‹น๋Ÿ‰์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค! ### OpenAI ์ฝ”๋ฑ์Šค(Plus/Pro) ```bash Dashboard โ†’ Providers โ†’ Connect Codex โ†’ OAuth login (port 1455) โ†’ 5-hour + weekly reset Models: cx/gpt-5.2-codex cx/gpt-5.1-codex-max ``` ### Gemini CLI(์›” 180,000 ๋ฌด๋ฃŒ!) ```bash Dashboard โ†’ Providers โ†’ Connect Gemini CLI โ†’ Google OAuth โ†’ 180K completions/month + 1K/day Models: gc/gemini-3-flash-preview gc/gemini-2.5-pro ``` **์ตœ๊ณ ์˜ ๊ฐ€์น˜:** ์—„์ฒญ๋‚œ ๋ฌด๋ฃŒ ๋“ฑ๊ธ‰! ์œ ๋ฃŒ ๋“ฑ๊ธ‰ ์ด์ „์— ์‚ฌ์šฉํ•˜์„ธ์š”. ### GitHub ์ฝ”ํŒŒ์ผ๋Ÿฟ ```bash Dashboard โ†’ Providers โ†’ Connect GitHub โ†’ OAuth via GitHub โ†’ Monthly reset (1st of month) Models: gh/gpt-5 gh/claude-4.5-sonnet gh/gemini-3-pro ```
๐Ÿ”‘ API ํ‚ค ์ œ๊ณต์ž ### NVIDIA NIM(๋ฌด๋ฃŒ 1000 ํฌ๋ ˆ๋”ง!) 1. ๊ฐ€์ž…: [build.nvidia.com](https://build.nvidia.com) 2. ๋ฌด๋ฃŒ API ํ‚ค ๋ฐ›๊ธฐ(1000 ์ถ”๋ก  ํฌ๋ ˆ๋”ง ํฌํ•จ) 3. ๋Œ€์‹œ๋ณด๋“œ โ†’ ๊ณต๊ธ‰์ž ์ถ”๊ฐ€ โ†’ NVIDIA NIM: - API ํ‚ค: `nvapi-your-key` **๋ชจ๋ธ:** `nvidia/llama-3.3-70b-instruct`, `nvidia/mistral-7b-instruct` ์™ธ 50๊ฐœ ์ด์ƒ **ํ”„๋กœ ํŒ:** OpenAI ํ˜ธํ™˜ API โ€” OmniRoute์˜ ํ˜•์‹ ๋ณ€ํ™˜๊ณผ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ### ๋”ฅ์‹œํฌ 1. ๊ฐ€์ž…: [platform.deepseek.com](https://platform.deepseek.com) 2. API ํ‚ค ๋ฐ›๊ธฐ 3. ๋Œ€์‹œ๋ณด๋“œ โ†’ ๊ณต๊ธ‰์ž ์ถ”๊ฐ€ โ†’ DeepSeek **๋ชจ๋ธ:** `deepseek/deepseek-chat`, `deepseek/deepseek-coder` ### Groq(๋ฌด๋ฃŒ ๋“ฑ๊ธ‰ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!) 1. ๊ฐ€์ž…: [console.groq.com](https://console.groq.com) 2. API ํ‚ค ๋ฐ›๊ธฐ(๋ฌด๋ฃŒ ๋“ฑ๊ธ‰ ํฌํ•จ) 3. ๋Œ€์‹œ๋ณด๋“œ โ†’ ๊ณต๊ธ‰์ž ์ถ”๊ฐ€ โ†’ Groq **๋ชจ๋ธ:** `groq/llama-3.3-70b`, `groq/mixtral-8x7b` **ํ”„๋กœ ํŒ:** ์ดˆ๊ณ ์† ์ถ”๋ก  โ€” ์‹ค์‹œ๊ฐ„ ์ฝ”๋”ฉ์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค! ### OpenRouter(100๊ฐœ ์ด์ƒ์˜ ๋ชจ๋ธ) 1. ๊ฐ€์ž…: [openrouter.ai](https://openrouter.ai) 2. API ํ‚ค ๋ฐ›๊ธฐ 3. ๋Œ€์‹œ๋ณด๋“œ โ†’ ๊ณต๊ธ‰์ž ์ถ”๊ฐ€ โ†’ OpenRouter **๋ชจ๋ธ:** ๋‹จ์ผ API ํ‚ค๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ฃผ์š” ์ œ๊ณต์—…์ฒด์˜ 100๊ฐœ ์ด์ƒ์˜ ๋ชจ๋ธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ’ฐ ์ €๋ ดํ•œ ๊ณต๊ธ‰์ž(๋ฐฑ์—…) ### GLM-4.7 (์ผ์ผ ์žฌ์„ค์ •, $0.6/1M) 1. ๊ฐ€์ž…: [Zhipu AI](https://open.bigmodel.cn/) 2. Coding Plan์—์„œ API Key ๋ฐ›๊ธฐ 3. ๋Œ€์‹œ๋ณด๋“œ โ†’ API ํ‚ค ์ถ”๊ฐ€: - ์ œ๊ณต์ž: `glm` - API ํ‚ค: `your-key` **์‚ฌ์šฉ:** `glm/glm-4.7` **ํ”„๋กœ ํŒ:** ์ฝ”๋”ฉ ๊ณ„ํš์€ 1/7 ๋น„์šฉ์œผ๋กœ 3๋ฐฐ ํ• ๋‹น๋Ÿ‰์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค! ๋งค์ผ ์˜ค์ „ 10์‹œ์— ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ### MiniMax M2.1(5์‹œ๊ฐ„ ์žฌ์„ค์ •, $0.20/1M) 1. ๊ฐ€์ž…: [MiniMax](https://www.minimax.io/) 2. API ํ‚ค ๋ฐ›๊ธฐ 3. ๋Œ€์‹œ๋ณด๋“œ โ†’ API Key ์ถ”๊ฐ€ **์‚ฌ์šฉ:** `minimax/MiniMax-M2.1` **ํ”„๋กœ ํŒ:** ๊ธด ์ปจํ…์ŠคํŠธ(100๋งŒ ํ† ํฐ)๋ฅผ ์œ„ํ•œ ๊ฐ€์žฅ ์ €๋ ดํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค! ### Kimi K2($9/์›” ์ •์•ก) 1. ๊ตฌ๋…: [Moonshot AI](https://platform.moonshot.ai/) 2. API ํ‚ค ๋ฐ›๊ธฐ 3. ๋Œ€์‹œ๋ณด๋“œ โ†’ API Key ์ถ”๊ฐ€ **์‚ฌ์šฉ:** `kimi/kimi-latest` **ํ”„๋กœ ํŒ:** 1,000๋งŒ ํ† ํฐ์— ๋Œ€ํ•ด ๊ณ ์ • $9/์›” = $0.90/1M ์œ ํšจ ๋น„์šฉ!
๐Ÿ†“ ๋ฌด๋ฃŒ ์ œ๊ณต์—…์ฒด(๊ธด๊ธ‰ ๋ฐฑ์—…) ### iFlow(8๊ฐœ ๋ฌด๋ฃŒ ๋ชจ๋ธ) ```bash Dashboard โ†’ Connect iFlow โ†’ iFlow OAuth login โ†’ Unlimited usage Models: if/kimi-k2-thinking if/qwen3-coder-plus if/glm-4.7 if/minimax-m2 if/deepseek-r1 ``` ### Qwen(3๊ฐœ ๋ฌด๋ฃŒ ๋ชจ๋ธ) ```bash Dashboard โ†’ Connect Qwen โ†’ Device code authorization โ†’ Unlimited usage Models: qw/qwen3-coder-plus qw/qwen3-coder-flash ``` ### ํ‚ค๋กœ(ํด๋กœ๋“œ ํ”„๋ฆฌ) ```bash Dashboard โ†’ Connect Kiro โ†’ AWS Builder ID or Google/GitHub โ†’ Unlimited usage Models: kr/claude-sonnet-4.5 kr/claude-haiku-4.5 ```
๐ŸŽจ ์ฝค๋ณด ๋งŒ๋“ค๊ธฐ ### ์˜ˆ์‹œ 1: ๊ตฌ๋… ์ตœ๋Œ€ํ™” โ†’ ์ €๋ ดํ•œ ๋ฐฑ์—… ``` Dashboard โ†’ Combos โ†’ Create New Name: premium-coding Models: 1. cc/claude-opus-4-6 (Subscription primary) 2. glm/glm-4.7 (Cheap backup, $0.6/1M) 3. minimax/MiniMax-M2.1 (Cheapest fallback, $0.20/1M) Use in CLI: premium-coding ``` ### ์˜ˆ์‹œ 2: ๋ฌด๋ฃŒ ์ „์šฉ(๋น„์šฉ ์—†์Œ) ``` Name: free-combo Models: 1. gc/gemini-3-flash-preview (180K free/month) 2. if/kimi-k2-thinking (unlimited) 3. qw/qwen3-coder-plus (unlimited) Cost: $0 forever! ```
๐Ÿ”ง CLI ํ†ตํ•ฉ ### ์ปค์„œ IDE ``` Settings โ†’ Models โ†’ Advanced: OpenAI API Base URL: http://localhost:20128/v1 OpenAI API Key: [from OmniRoute dashboard] Model: cc/claude-opus-4-6 ``` ### ํด๋กœ๋“œ ์ฝ”๋“œ ์›ํด๋ฆญ ๊ตฌ์„ฑ์„ ์œ„ํ•ด ๋Œ€์‹œ๋ณด๋“œ์˜ **CLI ๋„๊ตฌ** ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ `~/.claude/settings.json`์„ ์ˆ˜๋™์œผ๋กœ ํŽธ์ง‘ํ•˜์„ธ์š”. ### ์ฝ”๋ฑ์Šค CLI ```bash export OPENAI_BASE_URL="http://localhost:20128" export OPENAI_API_KEY="your-omniroute-api-key" codex "your prompt" ``` ### ์˜คํ”ˆํด๋กœ **์˜ต์…˜ 1 - ๋Œ€์‹œ๋ณด๋“œ(๊ถŒ์žฅ):** ``` Dashboard โ†’ CLI Tools โ†’ OpenClaw โ†’ Select Model โ†’ Apply ``` **์˜ต์…˜ 2 โ€” ์ˆ˜๋™:** `~/.openclaw/openclaw.json` ํŽธ์ง‘: ```json { "models": { "providers": { "omniroute": { "baseUrl": "http://127.0.0.1:20128/v1", "apiKey": "sk_omniroute", "api": "openai-completions" } } } } ``` > **์ฐธ๊ณ :** OpenClaw๋Š” ๋กœ์ปฌ OmniRoute์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. IPv6 ํ™•์ธ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด `localhost` ๋Œ€์‹  `127.0.0.1`์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ### ํด๋ผ์ธ / ๊ณ„์† / RooCode ``` Settings โ†’ API Configuration: Provider: OpenAI Compatible Base URL: http://localhost:20128/v1 API Key: [from OmniRoute dashboard] Model: if/kimi-k2-thinking ```
--- ## ๐Ÿงช ํ‰๊ฐ€(Evals) OmniRoute์—๋Š” ๊ณจ๋“  ์„ธํŠธ์— ๋Œ€ํ•ด LLM ์‘๋‹ต ํ’ˆ์งˆ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์žฅ ํ‰๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์˜ **๋ถ„์„ โ†’ ํ‰๊ฐ€**๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•˜์„ธ์š”. ### ๋‚ด์žฅ ๊ณจ๋“  ์„ธํŠธ ์‚ฌ์ „ ๋กœ๋“œ๋œ "OmniRoute Golden Set"์—๋Š” ๋‹ค์Œ์„ ๋‹ค๋ฃจ๋Š” 10๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. - ์ธ์‚ฌ๋ง, ์ˆ˜ํ•™, ์ง€๋ฆฌ, ์ฝ”๋“œ ์ƒ์„ฑ - JSON ํ˜•์‹ ์ค€์ˆ˜, ๋ฒˆ์—ญ, ๋งˆํฌ๋‹ค์šด - ์•ˆ์ „ ๊ฑฐ๋ถ€(์œ ํ•ด ์ฝ˜ํ…์ธ ), ์นด์šดํŒ…, ๋ถ€์šธ ๋…ผ๋ฆฌ ### ํ‰๊ฐ€ ์ „๋žต | ์ „๋žต | ์„ค๋ช… | ์˜ˆ | | ---------- | -------------------------------------------------------------- | -------------------------------- | | `exact` | ์ถœ๋ ฅ์€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค | `"4"` | | `contains` | ์ถœ๋ ฅ์—๋Š” ํ•˜์œ„ ๋ฌธ์ž์—ด(๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์•ˆ ํ•จ)์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. | `"Paris"` | | `regex` | ์ถœ๋ ฅ์€ ์ •๊ทœ์‹ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค | `"1.*2.*3"` | | `custom` | ์‚ฌ์šฉ์ž ์ •์˜ JS ํ•จ์ˆ˜๊ฐ€ true/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. | `(output) => output.length > 10` | --- ## ๐Ÿ› ๋ฌธ์ œ ํ•ด๊ฒฐ
๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ๋ฅผ ํ™•์žฅํ•˜๋ ค๋ฉด ํด๋ฆญํ•˜์„ธ์š” **"์–ธ์–ด ๋ชจ๋ธ์ด ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค"** - ๊ณต๊ธ‰์ž ํ• ๋‹น๋Ÿ‰ ์†Œ์ง„ โ†’ ๋Œ€์‹œ๋ณด๋“œ ํ• ๋‹น๋Ÿ‰ ์ถ”์ ๊ธฐ ํ™•์ธ - ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ์ฝค๋ณด ํด๋ฐฑ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋” ์ €๋ ดํ•œ ๊ณ„์ธต์œผ๋กœ ์ „ํ™˜ํ•˜์„ธ์š”. **๋น„์œจ ์ œํ•œ** - ๊ตฌ๋… ํ• ๋‹น๋Ÿ‰ ์ดˆ๊ณผ โ†’ GLM/MiniMax๋กœ ๋Œ€์ฒด - ์ฝค๋ณด ์ถ”๊ฐ€: `cc/claude-opus-4-6 โ†’ glm/glm-4.7 โ†’ if/kimi-k2-thinking` **OAuth ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค** - OmniRoute์— ์˜ํ•ด ์ž๋™ ์ƒˆ๋กœ๊ณ ์นจ - ๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๋Š” ๊ฒฝ์šฐ: Dashboard โ†’ Provider โ†’ Reconnect **๋†’์€ ๋น„์šฉ** - ๋Œ€์‹œ๋ณด๋“œ โ†’ ๋น„์šฉ์—์„œ ์‚ฌ์šฉ ํ†ต๊ณ„๋ฅผ ํ™•์ธํ•˜์„ธ์š”. - ๊ธฐ๋ณธ ๋ชจ๋ธ์„ GLM/MiniMax๋กœ ์ „ํ™˜ - ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์ž‘์—…์—๋Š” ๋ฌด๋ฃŒ ๊ณ„์ธต(Gemini CLI, iFlow)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. **๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ž˜๋ชป๋œ ํฌํŠธ์—์„œ ์—ด๋ฆฝ๋‹ˆ๋‹ค** - `PORT=20128` ๋ฐ `NEXT_PUBLIC_BASE_URL=http://localhost:20128` ์„ค์ • **ํด๋ผ์šฐ๋“œ ๋™๊ธฐํ™” ์˜ค๋ฅ˜** - `BASE_URL`์ด ์‹คํ–‰ ์ค‘์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. - `CLOUD_URL`์ด ์˜ˆ์ƒ ํด๋ผ์šฐ๋“œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. - `NEXT_PUBLIC_*` ๊ฐ’์„ ์„œ๋ฒ„์ธก ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. **์ฒซ ๋ฒˆ์งธ ๋กœ๊ทธ์ธ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค** - `.env`์—์„œ `INITIAL_PASSWORD`์„ ํ™•์ธํ•˜์„ธ์š”. - ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ€์ฒด ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” `123456`์ž…๋‹ˆ๋‹ค. **์š”์ฒญ ๋กœ๊ทธ ์—†์Œ** - `.env`์— `ENABLE_REQUEST_LOGS=true`์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. **OpenAI ํ˜ธํ™˜ ๊ณต๊ธ‰์ž์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ์—์„œ "์ž˜๋ชป๋จ"์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค** - ๋งŽ์€ ๊ณต๊ธ‰์ž๊ฐ€ `/models` ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - OmniRoute v1.0.6+์—๋Š” ์ฑ„ํŒ… ์™„๋ฃŒ๋ฅผ ํ†ตํ•œ ๋Œ€์ฒด ๊ฒ€์ฆ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. - ๊ธฐ๋ณธ URL์— `/v1` ์ ‘๋ฏธ์‚ฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ### ๐Ÿ” OAuth em Servidor Remoto(์›๊ฒฉ OAuth ์„ค์ •) > **โš ๏ธ VPS/Docker/remotor์˜ OmniRoute๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘์š”** ### OAuth์—์„œ Antigravity/Gemini CLI๋ฅผ ์›๊ฒฉ ์„œ๋น„์Šค๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? Os๋Š” **๋ฐ˜์ค‘๋ ฅ** ๋ฐ **Gemini CLI**๋ฅผ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•ด **Google OAuth 2.0**์„ ์ž…์ฆํ–ˆ์Šต๋‹ˆ๋‹ค. O Google exige que a `redirect_uri` usada no fluxo OAuth seja **exatamente** uma das URIs pre-cadastradas no Google Cloud Console do aplicativo. OAuth๋Š” OmniRoute์— ๋Œ€ํ•œ ์‹ ์šฉ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ **`localhost`**์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. Quando vocรช acessa o OmniRoute em um servidor remoto (์˜ˆ: `https://omniroute.meuservidor.com`), o Google rejeita autenticaรงรฃo com: ``` Error 400: redirect_uri_mismatch ``` ### ํ•ด๊ฒฐ์ฑ…: ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ OAuth ๊ตฌ์„ฑ Vocรช precisa criar um **OAuth 2.0 Client ID** no Google Cloud Console com a URI do seu servidor. #### ํŒŒ์˜ ์•„ ํŒŒ์†Œ **1. Google Cloud Console์— ์•ก์„ธ์Šค** ์•„๋ธŒ๋ผ: [https://console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials) **2. Crie um novo OAuth 2.0 ํด๋ผ์ด์–ธํŠธ ID** - em ํด๋ฆญ **"+ ์ž๊ฒฉ ์ฆ๋ช… ๋งŒ๋“ค๊ธฐ"** โ†’ **"OAuth ํด๋ผ์ด์–ธํŠธ ID"** - ์ ์šฉ ๋ถ„์•ผ: **"์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜"** - ์ด๋ฆ„: escolha qualquer nome (์˜ˆ: `OmniRoute Remote`) **3. ์Šน์ธ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI๋กœ์„œ์˜ Adicione** ์•„๋‹ˆ์š” **"์Šน์ธ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI"**, ์ถ”๊ฐ€: ``` https://seu-servidor.com/callback ``` > `seu-servidor.com` pelo domรญnio ๋˜๋Š” IP do seu servidor๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ํฌํŠธ ํฌํ•จ, ์˜ˆ: `http://45.33.32.156:20128/callback`). **4. ์‚ฌ๋ณธ์„ ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ ์ €์žฅ** Apรณs criar, o Google morerรก o **ํด๋ผ์ด์–ธํŠธ ID** e o **ํด๋ผ์ด์–ธํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ**. **5. ๋‹ค์–‘ํ•œ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์œผ๋กœ ๊ตฌ์„ฑ** `.env`(Docker์˜ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)์ด ์—†์Šต๋‹ˆ๋‹ค. ```bash # Para Antigravity: ANTIGRAVITY_OAUTH_CLIENT_ID=seu-client-id.apps.googleusercontent.com ANTIGRAVITY_OAUTH_CLIENT_SECRET=GOCSPX-seu-secret # Para Gemini CLI: GEMINI_OAUTH_CLIENT_ID=seu-client-id.apps.googleusercontent.com GEMINI_OAUTH_CLIENT_SECRET=GOCSPX-seu-secret GEMINI_CLI_OAUTH_CLIENT_SECRET=GOCSPX-seu-secret ``` **6. Reinicie ๋˜๋Š” OmniRoute** ```bash # Se usando npm: npm run dev # Se usando Docker: docker restart omniroute ``` **7. Tente conectar novamente** ๋Œ€์‹œ๋ณด๋“œ โ†’ ๊ณต๊ธ‰์ž โ†’ Antigravity(๋˜๋Š” Gemini CLI) โ†’ OAuth Agora๋Š” `https://seu-servidor.com/callback` ๋ฐ ์ž๋™ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ Google ๋ฆฌ๋””๋ ‰์…˜์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. --- ### ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•(sem configurar credenciais prรณprias) Se nรฃo quiser criar credenciais prรณprias agora, ainda รฉ possรญvel usar o fluxo **manual de URL**: 1. OmniRoute๋Š” Google ์ž๋™ ์ƒ์„ฑ URL์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 2. Apรณs vocรช autorizar, o Google tentarรก redirectionar para `localhost` (que falha no servidor remoto) 3. **URL ๋ณต์‚ฌ ์™„๋ฃŒ** da barra de endereรงo do seu browser (mesmo que a pรกgina nรฃo carregue) 4. Cole essa URL no campo que aparece no modal de conexรฃo do OmniRoute 5. Clique em **"์—ฐ๊ฒฐ"** > ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ URL์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
--- ## ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ - **๋Ÿฐํƒ€์ž„**: Node.js 18โ€“22 LTS(โš ๏ธ Node.js 24+๋Š” **์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค** โ€” `better-sqlite3` ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค) - **์–ธ์–ด**: TypeScript 5.9 โ€” `src/` ๋ฐ `open-sse/`์—์„œ **100% TypeScript**(v1.0.6) - **ํ”„๋ ˆ์ž„์›Œํฌ**: Next.js 16 + React 19 + Tailwind CSS 4 - **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**: LowDB(JSON) + SQLite(๋„๋ฉ”์ธ ์ƒํƒœ + ํ”„๋ก์‹œ ๋กœ๊ทธ) - **์ŠคํŠธ๋ฆฌ๋ฐ**: ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ ์ด๋ฒคํŠธ(SSE) - **์ธ์ฆ**: OAuth 2.0(PKCE) + JWT + API ํ‚ค - **ํ…Œ์ŠคํŠธ**: Node.js ํ…Œ์ŠคํŠธ ์‹คํ–‰๊ธฐ(368๊ฐœ ์ด์ƒ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ) - **CI/CD**: GitHub Actions(์ž๋™ npm ๊ฒŒ์‹œ + ์ถœ์‹œ ์‹œ Docker Hub) - **์›น์‚ฌ์ดํŠธ**: [omniroute.online](https://omniroute.online) - **ํŒจํ‚ค์ง€**: [npmjs.com/package/omniroute](https://www.npmjs.com/package/omniroute) - **๋„์ปค**: [hub.docker.com/r/diegosouzapw/omniroute](https://hub.docker.com/r/diegosouzapw/omniroute) - **๋ณต์›๋ ฅ**: ํšŒ๋กœ ์ฐจ๋‹จ๊ธฐ, ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„, ์ฒœ๋‘ฅ ๋ฐฉ์ง€ ๋ฌด๋ฆฌ, TLS ์Šคํ‘ธํ•‘ --- ## ๐Ÿ“– ๋ฌธ์„œ | ๋ฌธ์„œ | ์„ค๋ช… | | -------------------------------------------- | ------------------------------------------ | | [User Guide](docs/USER_GUIDE.md) | ๊ณต๊ธ‰์ž, ์ฝค๋ณด, CLI ํ†ตํ•ฉ, ๋ฐฐํฌ | | [API Reference](docs/API_REFERENCE.md) | ์˜ˆ์ œ๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ | | [Troubleshooting](docs/TROUBLESHOOTING.md) | ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• | | [Architecture](docs/ARCHITECTURE.md) | ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋‚ด๋ถ€ | | [Contributing](CONTRIBUTING.md) | ๊ฐœ๋ฐœ ์„ค์ • ๋ฐ ์ง€์นจ | | [OpenAPI Spec](docs/openapi.yaml) | OpenAPI 3.0 ์‚ฌ์–‘ | | [Security Policy](SECURITY.md) | ์ทจ์•ฝ์  ๋ณด๊ณ  ๋ฐ ๋ณด์•ˆ ๊ด€ํ–‰ | | [VM Deployment](docs/VM_DEPLOYMENT_GUIDE.md) | ์ „์ฒด ๊ฐ€์ด๋“œ: VM + nginx + Cloudflare ์„ค์ • | | [Features Gallery](docs/FEATURES.md) | ์Šคํฌ๋ฆฐ์ƒท์„ ํฌํ•จํ•œ ์‹œ๊ฐ์  ๋Œ€์‹œ๋ณด๋“œ ๋‘˜๋Ÿฌ๋ณด๊ธฐ | ### ๐Ÿ“ธ ๋Œ€์‹œ๋ณด๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
๋Œ€์‹œ๋ณด๋“œ ์Šคํฌ๋ฆฐ์ƒท์„ ๋ณด๋ ค๋ฉด ํด๋ฆญํ•˜์„ธ์š”. | ํŽ˜์ด์ง€ | ์Šคํฌ๋ฆฐ์ƒท | | -------------- | ------------------------------------------------- | | **๊ณต๊ธ‰์ž** | ![Providers](docs/screenshots/01-providers.png) | | **์ฝค๋ณด** | ![Combos](docs/screenshots/02-combos.png) | | **๋ถ„์„** | ![Analytics](docs/screenshots/03-analytics.png) | | **๊ฑด๊ฐ•** | ![Health](docs/screenshots/04-health.png) | | **๋ฒˆ์—ญ๊ฐ€** | ![Translator](docs/screenshots/05-translator.png) | | **์„ค์ •** | ![Settings](docs/screenshots/06-settings.png) | | **CLI ๋„๊ตฌ** | ![CLI Tools](docs/screenshots/07-cli-tools.png) | | **์‚ฌ์šฉ ๋กœ๊ทธ** | ![Usage](docs/screenshots/08-usage.png) | | **์—”๋“œํฌ์ธํŠธ** | ![Endpoint](docs/screenshots/09-endpoint.png) |
--- ## ๐Ÿ—บ๏ธ ๋กœ๋“œ๋งต OmniRoute์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์— ๊ฑธ์ณ **210๊ฐœ ์ด์ƒ์˜ ๊ธฐ๋Šฅ์ด ๊ณ„ํš๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค**. ์ฃผ์š” ์˜์—ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. | ์นดํ…Œ๊ณ ๋ฆฌ | ๊ณ„ํš๋œ ๊ธฐ๋Šฅ | ํ•˜์ด๋ผ์ดํŠธ | | --------------------------- | ----------- | ------------------------------------------------------------------------------ | | ๐Ÿง  **๋ผ์šฐํŒ… ๋ฐ ์ธํ…”๋ฆฌ์ „์Šค** | 25์„ธ ์ด์ƒ | ์ตœ์ € ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๋ผ์šฐํŒ…, ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…, ์‹คํ–‰ ์ „ ํ• ๋‹น๋Ÿ‰, P2C ๊ณ„์ • ์„ ํƒ | | ๐Ÿ”’ **๋ณด์•ˆ ๋ฐ ๊ทœ์ • ์ค€์ˆ˜** | 20์„ธ ์ด์ƒ | SSRF ๊ฐ•ํ™”, ์ž๊ฒฉ ์ฆ๋ช… ํด๋กœํ‚น, ์—”๋“œํฌ์ธํŠธ๋‹น ์†๋„ ์ œํ•œ, ๊ด€๋ฆฌ ํ‚ค ๋ฒ”์œ„ ์ง€์ • | | ๐Ÿ“Š **๊ด€์ธก์„ฑ** | 15์„ธ ์ด์ƒ | OpenTelemetry ํ†ตํ•ฉ, ์‹ค์‹œ๊ฐ„ ํ• ๋‹น๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ชจ๋ธ๋ณ„ ๋น„์šฉ ์ถ”์  | | ๐Ÿ”„ **๊ณต๊ธ‰์ž ํ†ตํ•ฉ** | 20์„ธ ์ด์ƒ | ๋™์  ๋ชจ๋ธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ๊ณต๊ธ‰์ž ์ฟจ๋‹ค์šด, ๋‹ค์ค‘ ๊ณ„์ • Codex, Copilot ํ• ๋‹น๋Ÿ‰ ๊ตฌ๋ฌธ ๋ถ„์„ | | โšก **์„ฑ๋Šฅ** | 15์„ธ ์ด์ƒ | ๋“€์–ผ ์บ์‹œ ๋ ˆ์ด์–ด, ํ”„๋กฌํ”„ํŠธ ์บ์‹œ, ์‘๋‹ต ์บ์‹œ, ์ŠคํŠธ๋ฆฌ๋ฐ Keepalive, ๋ฐฐ์น˜ API | | ๐ŸŒ **์ƒํƒœ๊ณ„** | 10์„ธ ์ด์ƒ | WebSocket API, ๊ตฌ์„ฑ ํ•ซ ๋ฆฌ๋กœ๋“œ, ๋ถ„์‚ฐ ๊ตฌ์„ฑ ์ €์žฅ์†Œ, ์ƒ์šฉ ๋ชจ๋“œ | ### ๐Ÿ”œ ์ถœ์‹œ ์˜ˆ์ • - ๐Ÿ”— **OpenCode ํ†ตํ•ฉ** โ€” OpenCode AI ์ฝ”๋”ฉ IDE์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ณต๊ธ‰์ž ์ง€์› - ๐Ÿ”— **TRAE ํ†ตํ•ฉ** โ€” TRAE AI ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์› - ๐Ÿ“ฆ **Batch API** โ€” ๋Œ€๋Ÿ‰ ์š”์ฒญ์— ๋Œ€ํ•œ ๋น„๋™๊ธฐ์‹ ์ผ๊ด„ ์ฒ˜๋ฆฌ - ๐ŸŽฏ **ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…** โ€” ์‚ฌ์šฉ์ž ์ •์˜ ํƒœ๊ทธ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ ๋ผ์šฐํŒ… - ๐Ÿ’ฐ **์ตœ์ € ๋น„์šฉ ์ „๋žต** โ€” ๊ฐ€์žฅ ์ €๋ ดํ•œ ์ œ๊ณต์—…์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. > ๐Ÿ“ [link](docs/new-features/)์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ „์ฒด ๊ธฐ๋Šฅ ์‚ฌ์–‘(217๊ฐœ ์„ธ๋ถ€ ์‚ฌ์–‘) --- ## ๐Ÿ“ง ์ง€์› > ๐Ÿ’ฌ **์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ฐ€์ž…ํ•˜์„ธ์š”!** [WhatsApp Group](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t) โ€” ๋„์›€์„ ๋ฐ›๊ณ , ํŒ์„ ๊ณต์œ ํ•˜๊ณ , ์ตœ์‹  ์†Œ์‹์„ ๋ฐ›์•„๋ณด์„ธ์š”. - **์›น์‚ฌ์ดํŠธ**: [omniroute.online](https://omniroute.online) - **GitHub**: [github.com/diegosouzapw/OmniRoute](https://github.com/diegosouzapw/OmniRoute) - **๋ฌธ์ œ**: [github.com/diegosouzapw/OmniRoute/issues](https://github.com/diegosouzapw/OmniRoute/issues) - **WhatsApp**: [Community Group](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t) - **์›๋ž˜ ํ”„๋กœ์ ํŠธ**: [9router by decolua](https://github.com/decolua/9router) --- ## ๐Ÿ‘ฅ ๊ธฐ์—ฌ์ž [![Contributors](https://contrib.rocks/image?repo=diegosouzapw/OmniRoute&max=100&columns=20&anon=1)](https://github.com/diegosouzapw/OmniRoute/graphs/contributors) ### ๊ธฐ์—ฌ ๋ฐฉ๋ฒ• 1. ์ €์žฅ์†Œ ํฌํฌ 2. ๊ธฐ๋Šฅ ๋ถ„๊ธฐ ์ƒ์„ฑ(`git checkout -b feature/amazing-feature`) 3. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค(`git commit -m 'Add amazing feature'`). 4. ๋ธŒ๋žœ์น˜(`git push origin feature/amazing-feature`)๋กœ ํ‘ธ์‹œ 5. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ์—ด๊ธฐ ์ž์„ธํ•œ ์ง€์นจ์€ [CONTRIBUTING.md](CONTRIBUTING.md)์„ ์ฐธ์กฐํ•˜์„ธ์š”. ### ์ƒˆ ๋ฒ„์ „ ์ถœ์‹œ ```bash # Create a release โ€” npm publish happens automatically gh release create v1.0.6 --title "v1.0.6" --generate-notes ``` --- ## ๐Ÿ“Š ์Šคํƒ€ ํžˆ์Šคํ† ๋ฆฌ Star History Chart --- ## ๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง์”€ ์ด ํฌํฌ์— ์˜๊ฐ์„ ์ค€ ์›๋ณธ ํ”„๋กœ์ ํŠธ์ธ **[decolua](https://github.com/decolua)**์˜ **[9router](https://github.com/decolua/9router)**์—๊ฒŒ ํŠน๋ณ„ํžˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. OmniRoute๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ, ๋‹ค์ค‘ ๋ชจ๋“œ API ๋ฐ ์ „์ฒด TypeScript ์žฌ์ž‘์„ฑ์„ ํ†ตํ•ด ๋†€๋ผ์šด ๊ธฐ๋ฐ˜์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์ด JavaScript ํฌํŠธ์— ์˜๊ฐ์„ ์ค€ ์ตœ์ดˆ์˜ Go ๊ตฌํ˜„์ธ **[CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI)**์—๊ฒŒ ํŠน๋ณ„ํžˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. --- ## ๐Ÿ“„ ๋ผ์ด์„ผ์Šค MIT ๋ผ์ด์„ ์Šค - ์ž์„ธํ•œ ๋‚ด์šฉ์€ [LICENSE](LICENSE)์„ ์ฐธ์กฐํ•˜์„ธ์š”. ---
์—ฐ์ค‘๋ฌดํœด์„ ์ฝ”๋”ฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•ด โค๏ธ์œผ๋กœ ๊ตฌ์ถ•๋จ
omniroute.online