55 KiB
OmniRoute Architecture (العربية)
🌐 Languages: 🇺🇸 English · 🇪🇸 es · 🇫🇷 fr · 🇩🇪 de · 🇮🇹 it · 🇷🇺 ru · 🇨🇳 zh-CN · 🇯🇵 ja · 🇰🇷 ko · 🇸🇦 ar · 🇮🇳 hi · 🇮🇳 in · 🇹🇭 th · 🇻🇳 vi · 🇮🇩 id · 🇲🇾 ms · 🇳🇱 nl · 🇵🇱 pl · 🇸🇪 sv · 🇳🇴 no · 🇩🇰 da · 🇫🇮 fi · 🇵🇹 pt · 🇷🇴 ro · 🇭🇺 hu · 🇧🇬 bg · 🇸🇰 sk · 🇺🇦 uk-UA · 🇮🇱 he · 🇵🇭 phi · 🇧🇷 pt-BR · 🇨🇿 cs · 🇹🇷 tr
آخر تحديث: 2026-03-28## الملخص التنفيذي
OmniRoute عبارة عن بوابة توجيه نقطة تعمل بالذكاء الاصطناعي ولوحة معلومات مبنية على Next.js.
وهو يوفر نقطة نهاية واحدة متوافقة مع OpenAI (/v1/*) ويوجه حركة المرور عبر العديد من الخدمات الموفري الأولية مع الترجمة والاحتياط وتحديث الرمز المميز وتتبع الاستخدام.
التان الأساسية:
- سطح API متوافق مع OpenAI لـ CLI/الأدوات (28 منتجًا)
- ترجمة الطلب/الاستجابة عبر التنسيقات الموفر
- نموذج بناء التحرير والسرد (سلسلة الارتباطات المتعددة)
- موازنة حساب الحساب (حسابات متعددة لكل شخص)
- إدارة اتصال موفر OAuth + API-key
- إنشاء التضمين عبر
/v1/embeddings(6 مقدمي خدمات، 9 نماذج) - إنشاء الصور عبر
/v1/images/Generation(4 مقدمي خدمات، 9 نماذج) - فكر في تحليل العلامات (
<think>...</think>) لنماذج الاستدلال - تحديد القيمة للتوافق مع OpenAI SDK
- تطبيع الدور (المطور → النظام، النظام → المستخدم) للتوافق بين الموفرين
- تحويل المنتج منظم (json_schema → Gemini ResponseSchema)
- الثبات المحلي لمقدمي الخدمات والمفاتيح والأسماء المستعارة والمجموعات والإعدادات والتسعير
- تتبع تكلفة/التكلفة وتسجيل الطلب
- نوبات سحابية اختيارية للأجهزة/الحالة الثابتة
- القائمة الخاصة بها/القائمة المحظورة لـ IP للتحكم في الوصول إلى واجهة برمجة التطبيقات
- التفكير في إدارة الميزانية (العبور / التلقائي / المقصود / التكيفي)
- هيكل البناء العالمي
- تتبع البصمات
- تحديد المحسن لكل حساب مع الملفات الشخصية الخاصة بالمزود
- تقطع فاصل لمرونة المورد
- حماية القطيع ضد الرعد مع موتكس
- ذاكرة التخزين المؤقتة لإلغاء البيانات المكررة للطلبة المستندية للتوقيع
- المجال: توفر النموذج، وقواعد التكلفة، والسياسة الاحتياطية، وسياسة فك الضغط
- فرانسيسكوية المجال المجال (ذاكرة التخزين المؤقتة للكتاب في SQLite للاحتياطيات والميزانيات وفتح قواطع الضوء)
- السياسة التي تحدد الطلب المركزي (التأمين → الميزانية → الاحتياطي)
- طلب القياس عن بعد مع تجميع الكمون ص50/ص95/ص99
- معرف الارتباط (X-Request-Id) للتتبع الشامل
- تسجيل تدقيق كامل مع إلغاء الاشتراك لمفتاح API
- إطار تقييمي وجودة LLM
- لوحة تحكم واجهة المستخدم المرنة مع فاصل زمني في العمل
- مفري OAuth المطاطيون (12 وحدة ضمن
src/lib/oauth/providers/)
وقت نموذج التشغيل الأساسي:
-
تقوم مسارات تطبيق Next.js ضمن
src/app/api/*ولتتمكن كل من واجهات تطبيقات برمجة لوحة المعلومات وواجهات برمجة تطبيقات التوافق -
نواة توجيه/SSE اشترك في
src/sse/*+open-sse/*تمويل مع تنفيذ الموفر والترجمة والتدفق والرجوع والاستخدام## النطاق والحدود### In Scope -
وقت تشغيل البوابة المحلية
-
واجهات برمجة التطبيقات المبتكرة للوحة المعلومات
-
مصادقة الموفر وتحديث الرمز المميز
-
طلب الترجمة و التدفق SSE
-
الحالة المحلية + استمرارية الاستخدام
-
نوبات سحابية اختيارية### خارج النطاق
-
تنفيذ خدمة السحابية خلف
NEXT_PUBLIC_CLOUD_URL -
مستوى تحرير السودان/مستوى التحكم خارج نطاق العمل
-
ثنائيات CLI الخارجية نفسها (Claude CLI، Codex CLI، وما إلى ذلك) ## سطح لوحة القيادة (الحالي)
الصفحة الرئيسية ضمن src/app/(dashboard)/dashboard/:
-
/dashboard- بداية سريعة + نظرة عامة على الموفر -
/dashboard/endpoint- وكيل نقطة النهاية + علامات نهاية نقطة النهاية MCP + A2A + API -
/dashboard/providers- اتصالات الموفر وبيانات الاعتماد -
/dashboard/combos- إستراتيجيات التحرير والسرد والقوالب وقواعد توجيه التطورات -
/dashboard/costs- تجميع الأسعار ورؤية الأسعار -
/dashboard/analytics- تحليلات تعاطيات البناء -
/dashboard/limits- ضوابط الحصص/المعدلات -
/dashboard/cli-tools- إعداد واجهة سطر مودم، والكشف عن وقت التشغيل، ويشمل ذلك -
/dashboard/agents— تم ابتكار عملاء ACP + تسجيل عميل مخصص -
/dashboard/media— ساحة لعب الصور/الفيديو/الموسيقى -
/dashboard/search-tools- اختبار خريطة البحث -
/dashboard/health- وقت التشغيل، قواطع الدائرة، حدود المعدل -
/dashboard/logs- سجلات الطلب/الوكيل/التدقيق/وحدة التحكم -
/dashboard/settings- علامات إعدادات النظام (عامة، توجيه، إعدادات التحرير والإعدادات البرمجية، إلخ.) -
/dashboard/api-manager- دورة حياة مفتاح برمجة برمجة التطبيقات والأذونات النموذجية## سياق النظام عالي المستوى```mermaid flowchart LR subgraph Clients[Developer Clients] C1[Claude Code] C2[Codex CLI] C3[OpenClaw / Droid / Cline / Continue / Roo] C4[Custom OpenAI-compatible clients] BROWSER[Browser Dashboard] endsubgraph Router[OmniRoute Local Process] API[V1 Compatibility API\n/v1/*] DASH[Dashboard + Management API\n/api/*] CORE[SSE + Translation Core\nopen-sse + src/sse] DB[(storage.sqlite)] UDB[(usage tables + log artifacts)] end subgraph Upstreams[Upstream Providers] P1[OAuth Providers\nClaude/Codex/Gemini/Qwen/Qoder/GitHub/Kiro/Cursor/Antigravity] P2[API Key Providers\nOpenAI/Anthropic/OpenRouter/GLM/Kimi/MiniMax\nDeepSeek/Groq/xAI/Mistral/Perplexity\nTogether/Fireworks/Cerebras/Cohere/NVIDIA] P3[Compatible Nodes\nOpenAI-compatible / Anthropic-compatible] end subgraph Cloud[Optional Cloud Sync] CLOUD[Cloud Sync Endpoint\nNEXT_PUBLIC_CLOUD_URL] end C1 --> API C2 --> API C3 --> API C4 --> API BROWSER --> DASH API --> CORE DASH --> DB CORE --> DB CORE --> UDB CORE --> P1 CORE --> P2 CORE --> P3 DASH --> CLOUD
## Core Runtime Components
## 1) API and Routing Layer (Next.js App Routes)
الدلائل الرئيسية:
- `src/app/api/v1/*` و `src/app/api/v1beta/*` لواجهات برمجة التطبيقات المتوافقة
- `src/app/api/*` لواجهات برمجة تطبيقات للإدارة/التكوين
- إعادة الكتابة التالية في الخريطة `next.config.mjs` `/v1/*` إلى `/api/v1/*`
طرق التوافق:
- `src/app/api/v1/chat/completions/route.ts`
- `src/app/api/v1/messages/route.ts`
- `src/app/api/v1/responses/route.ts`
- `src/app/api/v1/models/route.ts` - تشمل نماذج مخصصة ذات `مخصصة: صحيح`
- `src/app/api/v1/embeddings/route.ts` - إنشاء التضمين (6 مفري)
- `src/app/api/v1/images/ Generations/route.ts` - إنشاء الصور (4+ موفري خدمات بما في ذلك Antigravity/Nebius)
- `src/app/api/v1/messages/count_tokens/route.ts`
- `src/app/api/v1/providers/[provider]/chat/completions/route.ts` - دردشة مخصصة لكل المرشحين
- `src/app/api/v1/providers/[provider]/embeddings/route.ts` - عمليات التضمين المخصصة لكل المجالات
- `src/app/api/v1/providers/[provider]/images/ Generations/route.ts` - صور مخصصة لكل إطار
- `src/app/api/v1beta/models/route.ts`
- `src/app/api/v1beta/models/[...path]/route.ts`
الفترات الإدارية:
- المصادقة/الإعدادات: `src/app/api/auth/*`، `src/app/api/settings/*`
- مقدمو الخدمة/الاتصالات: `src/app/api/providers*`
- عقد الموفر: `src/app/api/provider-nodes*`
- الروابط ذات الصلة: `src/app/api/provider-models` (GET/POST/DELETE)
- كتالوج الارتباطات: `src/app/api/models/route.ts` (GET)
- الوكيل التنفيذي: `src/app/api/settings/proxy` (GET/PUT/DELETE) + `src/app/api/settings/proxy/test` (POST)
- OAuth: `src/app/api/oauth/*`
-لوحة المفاتيح/الأسماء المستعارة/المجموعات/التسعير: `src/app/api/keys*`، `src/app/api/models/alias`، `src/app/api/combos*`، `src/app/api/pricing`
-استخدام: `src/app/api/usage/*`
- الناقلات/السحابة: `src/app/api/sync/*`، `src/app/api/cloud/*`
- مساعدي أدوات CLI: `src/app/api/cli-tools/*`
- مرشح IP: `src/app/api/settings/ip-filter` (GET/PUT)
- تكلفة التفكير: `src/app/api/settings/thinking-budget` (GET/PUT)
- متشوق النظام: `src/app/api/settings/system-prompt` (GET/PUT)
- الجلسات: `src/app/api/sessions` (GET)
- النطاق المعدل: `src/app/api/rate-limits` (GET)
- معطف: `src/app/api/resilience` (GET/PATCH) - ملفات تعريف الموفر، التفاضل والتكامل، حالة لا يمكن تعديلها
- إعادة ضبط ضبط: `src/app/api/resilience/reset` (POST) - إعادة ضبط القواطع + تخفيف التهدئة
- إحصائيات ذاكرة تخزين مؤقتة: `src/app/api/cache/stats` (GET/DELETE)
- توفر النموذج: `src/app/api/models/availability` (GET/POST)
- القياس عن بعد: `src/app/api/telemetry/summary` (GET)
- الميزانية: `src/app/api/usage/budget` (GET/POST)
- السلاسل الاحتياطية: `src/app/api/fallback/chains` (GET/POST/DELETE)
- تدقيق تماما: `src/app/api/compliance/audit-log` (GET)
- التقييمات: `src/app/api/evals` (GET/POST)، `src/app/api/evals/[suiteId]` (GET)
- للمزيد: `src/app/api/policies` (GET/POST)## 2) SSE + Translation Core
وحدات السرعة الرئيسية:- الإدخال: `src/sse/handlers/chat.ts`
- أريد الأساسي: `open-sse/handlers/chatCore.ts`
- محولات تنفيذ الموفر: `open-sse/executors/*`
- الاكتشاف الجديد/تكوين الموفر: `open-sse/services/provider.ts`
- تحليل/حل النموذج: `src/sse/services/model.ts`، `open-sse/services/model.ts`
- الحساب الاحتياطي للحساب: `open-sse/services/accountFallback.ts`
- سجل الترجمة: `open-sse/translator/index.ts`
- تحويلات الدفق: `open-sse/utils/stream.ts`، `open-sse/utils/streamHandler.ts`
-الطلب/تطبيع الاستخدام: `open-sse/utils/usageTracking.ts`
- فكر في محلل العناوين: `open-sse/utils/thinkTagParser.ts`
-معالج التضمين: `open-sse/handlers/embeddings.ts`
- سجل موفر التضمين: open-sse/config/embeddingRegistry.ts
-معالج إنشاء الصور: `open-sse/handlers/imageGeneration.ts`
- سجل موفر الصور: `open-sse/config/imageRegistry.ts`
- تعريف القيمة: `open-sse/handlers/responseSanitizer.ts`
- تطبيع الدور: `open-sse/services/roleNormalizer.ts`
الخدمات (منطقة الأعمال):
- اختيار الحساب/تسجيل النقاط: `open-sse/services/accountSelector.ts`
- إدارة دورة حياة السياق: `open-sse/services/contextManager.ts`
- فرض مرشح IP: `open-sse/services/ipFilter.ts`
- تعقيب النظر: `open-sse/services/sessionManager.ts`
-طلب إلغاء البيانات المكررة: `open-sse/services/signatureCache.ts`
- البناء الكامل: `open-sse/services/systemPrompt.ts`
- التفكير في إدارة الميزانية: `open-sse/services/thinkingBudget.ts`
- توجيه نموذج حرف البدل: `open-sse/services/wildcardRouter.ts`
- إدارة إلى حد التعديل: `open-sse/services/rateLimitManager.ts`
- قاطع الدائرة: `open-sse/services/circuitBreaker.ts`
وحدات المجال:
- توفر النموذج: `src/lib/domain/modelAvailability.ts`
- متطلبات/ميزانيات التكلفة: `src/lib/domain/costRules.ts`
- السياسة الافتراضية: `src/lib/domain/fallbackPolicy.ts`
- محلل التحرير والسرد: `src/lib/domain/comboResolver.ts`
- تأمين التأمين: `src/lib/domain/lockoutPolicy.ts`
- محرك السياسة: `src/domain/policyEngine.ts` - القفل المركزي ← الميزانية ← التقييم الاحتياطي
- كتالوج الرموز لسبب: `src/lib/domain/errorCodes.ts`
- معرف الطلب: `src/lib/domain/requestId.ts`
- مهلة الجلب: `src/lib/domain/fetchTimeout.ts`
-طلب القياس عن بعد: `src/lib/domain/requestTelemetry.ts`
- شامل/الدقيق: `src/lib/domain/compliance/index.ts`
- عداء التقييم: `src/lib/domain/evalRunner.ts`
- دونية المجال المجال: `src/lib/db/domainState.ts` - SQLite CRUD للسلاسل الاحتياطية، والميزانيات، خسر التكلفة، وحالة القفل، وقواطع الضوء
وحدات موفر OAuth (12 ملفًا فرديًا ضمن `src/lib/oauth/providers/`):
- فهرس التسجيل: `src/lib/oauth/providers/index.ts`
- مقدمو الخدمات الأشخاص: `claude.ts`، `codex.ts`، `gemini.ts`، `antigravity.ts`، `qode.ts`، `qwen.ts`، `kimi-coding.ts`، `github.ts`، `kiro.ts`، `cursor.ts`، `kilocode.ts`، `cline.ts`
- طعام السباحة: `src/lib/oauth/providers.ts` - يُعاد تصديره من العناصر العناصر## 3) طبقة الثبات
قاعدة بيانات الحالة الأساسية (SQLite):- المعرفة البشرية الأساسية: `src/lib/db/core.ts` (better-sqlite3، migrations، WAL)
- واجهة إعادة التصدير: `src/lib/localDb.ts` (طبقة توافق مختلفة للمتصلين)
- الملف: `${DATA_DIR}/storage.sqlite` (أو `$XDG_CONFIG_HOME/omniroute/storage.sqlite` عند الضرورة، وإلا `~/.omniroute/storage.sqlite`)
- كيانات (الجداول + أسماء KV): ProvideConnections، وproviderNodes، وmodelAliases، والمجموعات، WapiKeys، والإعدادات، والتسعير،**customModels**،**proxyConfig**،**ipFilter**،**thinkingBudget**،**systemPrompt**
بمرور الوقت الاستخدام:
- الواجهة: `src/lib/usageDb.ts` (وحدات متحللة في `src/lib/usage/*`)
- جداول SQLite في `storage.sqlite`: `usage_history`، `call_logs`، `proxy_logs`
- تبرز عناصر الملف الاختياري للتوافق/تصحيح سبب (`${DATA_DIR}/log.txt`, `${DATA_DIR}/call_logs/`, `<repo>/logs/...`)
- يتم رحيل ملفات JSON القديمة إلى SQLite عن طريق عمليات رحيل بدء التشغيل عند وجودها
قاعدة بيانات المجال (SQLite):
- `src/lib/db/domainState.ts` - عمليات إنتاج CRUD لحالة المجال
- الجداول (التي تم تحديدها في `src/lib/db/core.ts`): `domain_fallback_chains`، `domain_budgets`، `domain_cost_history`، `domain_lockout_state`، `domain_circuit_breakers`.
- نمط ذاكرة التخزين المؤقت للكتابة: قرص الاتصال موجود في الذاكرة الموثوقة في وقت التشغيل؛ تتم كتابة الطفرات بشكل متزامن إلى SQLite؛ يتم استعادة حالة قاعدة البيانات عند البداية الباردة ## 4) المصادقة + الأسطح الأمنية
- مصادقة ملف تعريف الارتباط في لوحة المعلومات: `src/proxy.ts`، `src/app/api/auth/login/route.ts`
- إنشاء/التحقق من مفتاح واجهة برمجة التطبيقات: `src/shared/utils/apiKey.ts`
-أسرار الموفر في الخطوط "providerConnections".
- دعم خارجي تمامًا عبر `open-sse/utils/proxyFetch.ts` (env vars) و`open-sse/utils/networkProxy.ts` (قابل للتكوين لكل المرشحين أو عالمي)## 5) Cloud Sync
- جدولة init: `src/lib/initCloudSync.ts`، `src/shared/services/initializeCloudSync.ts`، `src/shared/services/modelSyncScheduler.ts`
- أهم الأحداث: `src/shared/services/cloudSyncScheduler.ts`
- أهم الأحداث: `src/shared/services/modelSyncScheduler.ts`
- التحكم في المسار: `src/app/api/sync/cloud/route.ts`## دورة حياة الطلب (`/v1/chat/completions`)```mermaid
sequenceDiagram
autonumber
participant Client as CLI/SDK Client
participant Route as /api/v1/chat/completions
participant Chat as src/sse/handlers/chat
participant Core as open-sse/handlers/chatCore
participant Model as Model Resolver
participant Auth as Credential Selector
participant Exec as Provider Executor
participant Prov as Upstream Provider
participant Stream as Stream Translator
participant Usage as usageDb
Client->>Route: POST /v1/chat/completions
Route->>Chat: handleChat(request)
Chat->>Model: parse/resolve model or combo
alt Combo model
Chat->>Chat: iterate combo models (handleComboChat)
end
Chat->>Auth: getProviderCredentials(provider)
Auth-->>Chat: active account + tokens/api key
Chat->>Core: handleChatCore(body, modelInfo, credentials)
Core->>Core: detect source format
Core->>Core: translate request to target format
Core->>Exec: execute(provider, transformedBody)
Exec->>Prov: upstream API call
Prov-->>Exec: SSE/JSON response
Exec-->>Core: response + metadata
alt 401/403
Core->>Exec: refreshCredentials()
Exec-->>Core: updated tokens
Core->>Exec: retry request
end
Core->>Stream: translate/normalize stream to client format
Stream-->>Client: SSE chunks / JSON response
Stream->>Usage: extract usage + persist history/log
Combo + Account Fallback Flow
flowchart TD
A[Incoming model string] --> B{Is combo name?}
B -- Yes --> C[Load combo models sequence]
B -- No --> D[Single model path]
C --> E[Try model N]
E --> F[Resolve provider/model]
D --> F
F --> G[Select account credentials]
G --> H{Credentials available?}
H -- No --> I[Return provider unavailable]
H -- Yes --> J[Execute request]
J --> K{Success?}
K -- Yes --> L[Return response]
K -- No --> M{Fallback-eligible error?}
M -- No --> N[Return error]
M -- Yes --> O[Mark account unavailable cooldown]
O --> P{Another account for provider?}
P -- Yes --> G
P -- No --> Q{In combo with next model?}
Q -- Yes --> E
Q -- No --> R[Return all unavailable]
يتم اتخاذ القرار الاحتياطي بواسطة open-sse/services/accountFallback.ts باستخدام رموز الحالة للاستدلال على رسائل الخطأ. تسهيل توجيه التشغيل والتنسيق بين الطرفين طوعًا للمساعدة في تقديم الطلبات: يتم التعامل مع 400s على نطاق الموفر مثل كتلة المحتوى الأول وفشل التحقق من صحة الدور على أنها فشل رئيسي للنموذج، لذا لا يزال لا يزال مطلوبًا التحرير والسرد التالي.## OAuth Onboarding and Token Refresh Lifecycle```mermaid
sequenceDiagram
autonumber
participant UI as Dashboard UI
participant OAuth as /api/oauth/[provider]/[action]
participant ProvAuth as Provider Auth Server
participant DB as localDb
participant Test as /api/providers/[id]/test
participant Exec as Provider Executor
UI->>OAuth: GET authorize or device-code
OAuth->>ProvAuth: create auth/device flow
ProvAuth-->>OAuth: auth URL or device code payload
OAuth-->>UI: flow data
UI->>OAuth: POST exchange or poll
OAuth->>ProvAuth: token exchange/poll
ProvAuth-->>OAuth: access/refresh tokens
OAuth->>DB: createProviderConnection(oauth data)
OAuth-->>UI: success + connection id
UI->>Test: POST /api/providers/[id]/test
Test->>Exec: validate credentials / optional refresh
Exec-->>Test: valid or refreshed token info
Test->>DB: update status/tokens/errors
Test-->>UI: validation result
يتم تنفيذ التحديث أثناء حركة التحرير المباشر داخل `open-sse/handlers/chatCore.ts` عبر المنفذ `refreshCredentials()`.## دورة حياة المزامنة السحابية (تمكين / مزامنة / تعطيل)```mermaid
sequenceDiagram
autonumber
participant UI as Endpoint Page UI
participant Sync as /api/sync/cloud
participant DB as localDb
participant Cloud as External Cloud Sync
participant Claude as ~/.claude/settings.json
UI->>Sync: POST action=enable
Sync->>DB: set cloudEnabled=true
Sync->>DB: ensure API key exists
Sync->>Cloud: POST /sync/{machineId} (providers/aliases/combos/keys)
Cloud-->>Sync: sync result
Sync->>Cloud: GET /{machineId}/v1/verify
Sync-->>UI: enabled + verification status
UI->>Sync: POST action=sync
Sync->>Cloud: POST /sync/{machineId}
Cloud-->>Sync: remote data
Sync->>DB: update newer local tokens/status
Sync-->>UI: synced
UI->>Sync: POST action=disable
Sync->>DB: set cloudEnabled=false
Sync->>Cloud: DELETE /sync/{machineId}
Sync->>Claude: switch ANTHROPIC_BASE_URL back to local (if needed)
Sync-->>UI: disabled
يتم تشغيل الدورية بواسطة "CloudSyncScheduler" عند السحابة.## نموذج البيانات وخريطة التخزين```mermaid erDiagram SETTINGS ||--o{ PROVIDER_CONNECTION : controls PROVIDER_NODE ||--o{ PROVIDER_CONNECTION : backs_compatible_provider PROVIDER_CONNECTION ||--o{ USAGE_ENTRY : emits_usage
SETTINGS {
boolean cloudEnabled
number stickyRoundRobinLimit
boolean requireLogin
string password_hash
string fallbackStrategy
json rateLimitDefaults
json providerProfiles
}
PROVIDER_CONNECTION {
string id
string provider
string authType
string name
number priority
boolean isActive
string apiKey
string accessToken
string refreshToken
string expiresAt
string testStatus
string lastError
string rateLimitedUntil
json providerSpecificData
}
PROVIDER_NODE {
string id
string type
string name
string prefix
string apiType
string baseUrl
}
MODEL_ALIAS {
string alias
string targetModel
}
COMBO {
string id
string name
string[] models
}
API_KEY {
string id
string name
string key
string machineId
}
USAGE_ENTRY {
string provider
string model
number prompt_tokens
number completion_tokens
string connectionId
string timestamp
}
CUSTOM_MODEL {
string id
string name
string providerId
}
PROXY_CONFIG {
string global
json providers
}
IP_FILTER {
string mode
string[] allowlist
string[] blocklist
}
THINKING_BUDGET {
string mode
number customBudget
string effortLevel
}
SYSTEM_PROMPT {
boolean enabled
string prompt
string position
}
ملفات الوضع المالي:
- قاعدة بيانات وقت التشغيل الأساسي: `${DATA_DIR}/storage.sqlite`
- أسطر سجل الطلب: `${DATA_DIR}/log.txt` (أداة متوافقة/تصحيح سبب)
- أرشيفات استضافة المؤتمرات التنظيمية: `${DATA_DIR}/call_logs/`
- مجموعات تصحيح الأخطاء المترجم/الطلب الاختيارية: `<repo>/logs/...`## Deployment Topology```mermaid
flowchart LR
subgraph LocalHost[Developer Host]
CLI[CLI Tools]
Browser[Dashboard Browser]
end
subgraph ContainerOrProcess[OmniRoute Runtime]
Next[Next.js Server\nPORT=20128]
Core[SSE Core + Executors]
MainDB[(storage.sqlite)]
UsageDB[(usage tables + log artifacts)]
end
subgraph External[External Services]
Providers[AI Providers]
SyncCloud[Cloud Sync Service]
end
CLI --> Next
Browser --> Next
Next --> Core
Next --> MainDB
Core --> MainDB
Core --> UsageDB
Core --> Providers
Next --> SyncCloud
Module Mapping (Decision-Critical)
Route and API Modules
-
src/app/api/v1/*،src/app/api/v1beta/*: واجهات برمجة التطبيقات المتوافقة -
src/app/api/v1/providers/[provider]/*: مسارات مخصصة لكل دليل (الدردشة والتضمينات والصور) -
src/app/api/providers*: موفر CRUD، التحقق من الصحة، الاختبار -
src/app/api/provider-nodes*: إدارة العقد المتوافقة المخصصة -
src/app/api/provider-models: إدارة الارتباطات المخصصة (CRUD) -
src/app/api/models/route.ts: برمجة تطبيقات كتالوج الارتباطات (الأسماء المستعارة + الارتباطات البديلة) -
src/app/api/oauth/*: تدفقات رمز OAuth/الجهاز -
src/app/api/keys*: دورة حياة مفتاح برمجة التطبيقات المحلية -
src/app/api/models/alias: إدارة الأسماء المستعارة -
src/app/api/combos*: إدارة التحرير والسرد الاحتياطي -
src/app/api/pricing: تجاوزات التسعير لحساب التكلفة -
src/app/api/settings/proxy: الصارم المعتمد (GET/PUT/DELETE) -
src/app/api/settings/proxy/test: اختبار تشغيل الوكيل (POST) -
src/app/api/usage/*: واجهات برمجة تطبيقات الاستخدام والسجلات -
src/app/api/sync/*+src/app/api/cloud/*: نوبات السحابية والمساعدون الذين يتحملون السحابة -
src/app/api/cli-tools/*: كاتب/أداة الدما لتكوين CLI المحلي -
src/app/api/settings/ip-filter: قائمة IP مخصصة لها/القائمة المبتكرة (GET/PUT) -
src/app/api/settings/thinking-budget: الاختيار المناسب رمز التفكير (GET/PUT) -
src/app/api/settings/system-prompt: موجه النظام العام (GET/PUT) -
src/app/api/sessions: قائمة العناصر العضوية (GET) -
src/app/api/rate-limits: حالة لا يمكن تعديلها لكل حساب (GET)### التوجيه والتنفيذ الأساسي -
src/sse/handlers/chat.ts: تحليل الطلب، ومعالجة التحرير والسرد، حلقة الحساب -
open-sse/handlers/chatCore.ts: الترجمة، المنفذ، إعادة المحاولة/التحديث، إعداد الدفق -
open-sse/executors/*: التحكم الشبكة والتنسيق الخاص بالموفر### سجل الترجمة ومحولات التنسيق -
open-sse/translator/index.ts: تسجيل المترجم وتنسيقه -طلب المترجمين:open-sse/translator/request/* -
مترجمو المصدر:
open-sse/translator/response/* -
ثوابت عادة:
open-sse/translator/formats.ts### Persistence -
src/lib/db/*: تفعيل/الحالة الفعالة واستمرارية المجال على SQLite -
src/lib/localDb.ts: إعادة تصدير التوافق لوحدات قاعدة البيانات -
src/lib/usageDb.ts: واجهة سجل/سجلات استخدامات المكالمات أعلى جداول SQLite## Provider Executor Coverage (Strategy Pattern)
يحتوي على كل موفر على منفذ تنفيذي متخصص لعدة BaseExecutor (في open-sse/executors/base.ts)، والذي يوفر بيانات إنشاء عنوان URL، ولكنه، جاهز المحاولة مع الأسيي، ومآثر تحديث الاعتماد، وطريقة استمرار execute(). |
المنفذ | المزود (المقدمون) | التعامل الخاص |
|---|---|---|---|
المنفذ الافتراضي |
أوبن إيه آي، كلود، جيميني، كوين، كيودر، أوبن روتر، جي إل إم، كيمي، ميني ماكس، ديب سيك، جروك، إكس آي آي، ميسترال، بيربليكسيتي، توغا، فاير ووركس، سيريبراس، كوهير، نفيديا | الاختيارية عنوان URL/الرأس الكيميائي لكل | |
منفذ مضاد للجغرافيا |
جوجل مكافحة الجاذبية | معرفات المشروع/الجلسة المخصصة، إعادة المحاولة بعد التحليل | |
منفذ الكودكس |
OpenAI Codex | يحقن تعليمات النظام، ويفرض جهدًا منطقيًا | |
منفذ مفصل |
بيئة تطوير متكاملة للمؤشر | البروتوكول ConnectRPC، ترجمة Protobuf، طلب التوقيع عبر الفصول الاختباري | |
GithubExecutor |
جيثب مساعد الطيار | تحديث الرمز المميز لـ Copilot، ورؤوس محاكاة VSCode | |
KiroExecutor |
AWS CodeWhisperer/كيرو | يتغير الثنائي لـ AWS EventStream → تحويل SSE | |
الجوزاءCLIEExecutor |
الجوزاء CLI | دورة تحديث رمز OAuth المميز لـ Google |
| يستخدم جميع الموفرين الآخرين (بما في ذلك العقد المتوافق المخصص) "DefaultExecutor".## مصفوفة توافق الموفرين | مقدم | التنسيق | مصادقة | تيار مستمر | غير دفق | تحديث الرمز المميز | برمجة تطبيقات الاستخدام |
|---|---|---|---|---|---|---|---|
| كلود | كلود | واجهة برمجة التطبيقات الرئيسية / OAuth | ✅ | ✅ | ✅ | ⚠️ المشرف فقط | |
| الجوزاء | الجوزاء | واجهة برمجة التطبيقات الرئيسية / OAuth | ✅ | ✅ | ✅ | ⚠️ وحدة التحكم السحابية | |
| الجوزاء CLI | الجوزاء-cli | أووث | ✅ | ✅ | ✅ | ⚠️ وحدة التحكم السحابية | |
| مكافحة الجاذبية | ضد الجاذبية | أووث | ✅ | ✅ | ✅ | ✅ الحصة الكاملة API | |
| أوبن آي | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| الدستور الغذائي | openai-responses | أووث | ✅ مجبور | ❌ | ✅ | ✅الحدود المعدلة | |
| جيثب مساعد الطيار | أوبيناي | OAuth + رمز مساعد الطيار | ✅ | ✅ | ✅ | ✅ لقطات الحصص | |
| مؤثر | مؤثر الاستطلاع المفضل | ✅ | ✅ | ❌ | ❌ | ||
| كيرو | كيرو | AWS SSO OIDC | ✅(ايفنت ستريم) | ❌ | ✅ | ✅ حدود الاستخدام | |
| كوين | أوبيناي | أووث | ✅ | ✅ | ✅ | ⚠️ طلب حسب الطلب | |
| قدير | أوبيناي | OAuth (أساسي) | ✅ | ✅ | ✅ | ⚠️ طلب حسب الطلب | |
| اوبن راوتر | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| جي إل إم/كيمي/ميني ماكس | كلود | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| ديب سيك | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| جروك | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| xAI (جروك) | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| ميسترال | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| الحيرة | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| منظمة العفو الدولية | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| منظمة العفو الدولية للعبة | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| الشيخ | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| كوهير | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | |
| نفيديا نيم | أوبيناي | مفتاح واجهة برمجة التطبيقات | ✅ | ✅ | ❌ | ❌ | ## تنسيق تغطية الترجمة |
تتضمن التنسيقات المصدر المكتشفة ما يلي:
أوبينيالردود المفتوحة- "كلود".
- "الجوزاء".
تتضمن الواردات التفصيلية ما يلي:
- دردشة/ردود OpenAI
- كلود -الجوزاء/الجوزاء-CLI/الظرف للجاذبية
- كيرو
- مرض
استخدم الترجماتOpenAI كتنسيق مركزي— جرب جميع التحويلات عبر OpenAI كتنسيق وسيط: تنسيق المصدر → OpenAI (المحور) → التنسيق المستهدف
يتم تحديد الترجمات ديناميكيًا استنادًا إلى شكل حمولة المصدر والتنسيق المستهدف للموفر.
طبقات معالجة إضافية في مسار الترجمة:
-تطهير الاستجابة— يزيل الحقول غير القياسية من استجابات تنسيق OpenAI (سواء المتدفقة أو غير المتدفقة) لضمان الامتثال الصارم لـ SDK -تطبيع الدور— تحويل المطور ← النظام للأهداف غير التابعة لـ OpenAI؛ يدمج "النظام" → "المستخدم" للنماذج التي ترفض دور النظام (GLM، ERNIE) -استخراج علامة التفكير— يوزع كتل <think>...</think> من المحتوى إلى حقل reasoning_content -الإخراج المنظم— يحول OpenAI response_format.json_schema إلى responseMimeType + responseSchema الخاص بـ Gemini## Supported API Endpoints
| نقطة النهاية | تنسيق | معالج | |
|---|---|---|---|
POST /v1/chat/completions |
دردشة OpenAI | src/sse/handlers/chat.ts |
|
POST /v1/messages |
رسائل كلود | نفس المعالج (تم اكتشافه تلقائيًا) | |
POST /v1/responses |
ردود OpenAI | open-sse/handlers/responsesHandler.ts |
|
POST /v1/embeddings |
تضمينات OpenAI | open-sse/handlers/embeddings.ts |
|
الحصول على /v1/embeddings |
قائمة النماذج | طريق API | |
POST /v1/images/أجيال |
صور OpenAI | open-sse/handlers/imageGeneration.ts |
|
الحصول على /v1/images/أجيال |
قائمة النماذج | طريق API | |
POST /v1/providers/{provider}/chat/completions |
دردشة OpenAI | مخصص لكل مزود مع التحقق من صحة النموذج | |
POST /v1/providers/{provider}/embeddings |
تضمينات OpenAI | مخصص لكل مزود مع التحقق من صحة النموذج | |
POST /v1/providers/{provider}/images/generations |
صور OpenAI | مخصص لكل مزود مع التحقق من صحة النموذج | |
POST /v1/messages/count_tokens |
عدد كلود توكن | طريق API | |
الحصول على /v1/models |
قائمة نماذج OpenAI | مسار واجهة برمجة التطبيقات (الدردشة + التضمين + الصورة + النماذج المخصصة) | |
الحصول على /api/models/catalog |
كتالوج | جميع النماذج مجمعة حسب الموفر + النوع | |
POST /v1beta/models/*:streamGenerateContent |
مولود برج الجوزاء | طريق API | |
الحصول على/PUT/DELETE /api/settings/proxy |
تكوين الوكيل | تكوين وكيل الشبكة | |
POST /api/settings/proxy/test |
اتصال الوكيل | نقطة نهاية اختبار صحة الوكيل/الاتصال | |
الحصول على/النشر/الحذف /api/provider-models |
نماذج المزود | البيانات الوصفية لنموذج الموفر تدعم النماذج المتاحة المخصصة والمدارة | ## Bypass Handler |
يعترض معالج التجاوز (open-sse/utils/bypassHandler.ts) طلبات "رمية سريعة" معروفة من Claude CLI - أصوات التمهيد، واستخراج العناوين، وعدد الرموز المميزة - ويعيداستجابة زائفةدون استهلاك الرموز المميزة للموفر الرئيسي. يتم تشغيل هذا فقط عندما يحتوي "User-Agent" على "clude-cli".## Request Logger Pipeline
يوفر مسجل الطلب (open-sse/utils/requestLogger.ts) مسارًا لتسجيل تصحيح الأخطاء مكون من 7 مراحل، معطل افتراضيًا، وممكن عبر ENABLE_REQUEST_LOGS=true:```
1_req_client.json → 2_req_source.json → 3_req_openai.json → 4_req_target.json
→ 5_res_provider.txt → 6_res_openai.txt → 7_res_client.txt
تتم كتابة الملفات إلى `<repo>/logs/<session>/` لكل جلسة طلب.## أوضاع الفشل والمرونة## 1) Account/Provider Availability
- عبارة عن حساب الموفر عند أخطاء/معدل/مصادقة
- إرجاع الحساب قبل فشل الطلب
- نموذج التحرير والسرد الاحتياطي عند استنفاد مسار النموذج/المزود الحالي## 2) Token Expiry
- ملفات التقدم والتحديث مع إعادة محاولة توفير خدمة موثوقة للتحديث
- 401/403 إعادة المحاولة بعد محاولة التحديث في المسار الأساسي## 3) Stream Safety
- وحدة تحكم قطع الاتصال بالتيار المستمر
- دفق الترجمة تدفق مع نهاية الدفق و `[تم]`
- ترخيص للاستخدام عندما تكون البيانات الوصفية للاستخدام الموفر المفقود## 4) تدهور المزامنة السحابية
- أخطاء الأخطاء ولكن استمر تشغيلها محليًا
- يحتوي على المجدول على منطقه قادر على إعادة المحاولة، ولكن التنفيذ الدوري يستدعي حاليا متزامنة التفعيل بشكل افتراضي## 5) Data Integrity
- عمليات ترحيل مخطط SQLite وفواتير الترقية التلقائية عند بدء التشغيل
- JSON القديم → مسار التوافق ترحيل SQLite## إمكانية المراقبة والإشارات التشغيلية
مصادر معرفة وقت التشغيل:
- أرشيف وحدة التحكم من `src/sse/utils/logger.ts`
- مجاميع الاستخدام لكل طلب في SQLite (`usage_history`، `call_logs`، `proxy_logs`)
- التقاط التفاصيل الصافية الصافية على أربع مراحل في SQLite (`request_detail_logs`) عندما تكون `settings.detailed_logs_enabled=true`
- سجل حالة الطلب النصي في "log.txt" (اختياري/متوافق)
- سجلات الطلب/الترجمة المتخصصة الاختيارية ضمن `السجلات/` عندما يكون `ENABLE_REQUEST_LOGS=true`
- نقاط نهاية استخدام معلومات اللوحة (`/api/usage/*`) لاستهلاك واجهة المستخدم
يقوم بالتقاط تكتيكات متعددة بتخزين ما يصل إلى أربع مراحل من نشاطات JSON لكل ما يستقبل بصرية:
- الطلب الوارد من العميل
- تم إرسال الطلب المترجم إلى المنبع
- إعادة بناء الرابط الموفر JSON؛ يتم ضغط الاستجابات المتدفقة إلى الملخص النهائي بالإضافة إلى بيانات تعريف الدفق
-الرد النهائي الذي تم إرجاعه بواسطة OmniRoute؛ يتم تخزين الاستجابات المتدفقة في نفس النموذج الملخص المكون## الحدود الحساسة للأمان
- يعمل سر JWT (`JWT_SECRET`) على تأمين المصادقة/التوقيع على ملف تعريف الارتباط لجلسة لوحة المعلومات
- يجب الالتزام بالبراءة الأولية لكلمة المرور (`INITIAL_PASSWORD`) ووافق على الاعتراف بها لأول مرة
- يعمل سر HMAC لمفتاح API (`API_KEY_SECRET`) على تنسيق تنسيق مفتاح API المحلي الذي تم التعاقد معه
- تظلل أسرار الموفر (مفاتيح/رموز برمجة التطبيقات) موجودة في قاعدة البيانات الأصلية وحماتها على مستوى نظام الملفات
- تعتمد نقاط نهاية الهجمات السحابية على مصادقة مفتاح API + دلالات معرف الجهاز## مصفوفة البيئة ووقت التشغيل
تحريرات البيئة المستخدمة بشكل نشط بواسطة تعليمات الحظر:- التطبيق/المصادقة: `JWT_SECRET`، `INITIAL_PASSWORD`
- التخزين: `DATA_DIR`
- العقدة المتوافقة: `ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE`
- تجاوز قاعدة الاختيار الاختيارية (Linux/macOS عند إلغاء تعيين `DATA_DIR`): `XDG_CONFIG_HOME`
- التجزئة الأمنية: `API_KEY_SECRET`، `MACHINE_ID_SALT`
- التسجيل: `ENABLE_REQUEST_LOGS`
- عناوين URL للاستقبال/السحابة: `NEXT_PUBLIC_BASE_URL`، `NEXT_PUBLIC_CLOUD_URL`
- الوكيل الشامل: `HTTP_PROXY`، `HTTPS_PROXY`، `ALL_PROXY`، `NO_PROXY` ومتغيرات الصغيرة الصغيرة
- علامات ميزات SOCKS5: `ENABLE_SOCKS5_PROXY`، `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY`
- مساعدو النظام الأساسي/وقت التشغيل (وليس تفعيل الخاص بالتطبيق): `APPDATA`، `NODE_ENV`، `PORT`، `HOSTNAME`## الملاحظات المعمارية المعروفة
1. تشارك `usageDb` و`localDb` في نفس الدليل الأساسي (`DATA_DIR` -> `XDG_CONFIG_HOME/omniroute` -> ``~/.omniroute`) مع ترحيل الملفات القديمة.
2. يفوض `/api/v1/route.ts` إلى نفس منشئ الكتالوج الموحد الذي يستخدمه `/api/v1/models` (`src/app/api/v1/models/catalog.ts`) العلم الانحراف الدلالي.
3. يقوم بطلب تسجيل بكتابة الرؤوس/النص الكامل عند جاكسونه؛ التعامل مع سجل الدليل على أنه حساسية.
4. يعتمد حماية السحابة على `NEXT_PUBLIC_BASE_URL` صحيح وإمكانية الوصول إلى نقطة نهاية السحابة.
5. تم نشر الدليل `open-sse/` باسم `@omniroute/open-sse`**حزمة مساحة العمل npm**. يقوم بكود المصدر باستيراده عبر `@omniroute/open-sse/...` (تم حله بواسطة Next.js `transpilePackages`). لا تسلك الطرق المستمرة في هذا المستند استخدم اسم الدليل `open-sse/` للاتساق.
6. نستخدم الكائنات الموجودة في لوحة المعلومات**Recharts**(المستندة إلى SVG) لتصورات التحليلات التفاعلية التي يمكن الوصول إليها (المخططات الشريطية للاستخدام للنموذج، والجرافيك المستخدمة للمخرجين مع النجاح).
7.استخدام السيولة E2E**Playwright**(`tests/e2e/`)، ويمكنها عبر `npm run test:e2e`. المستخدمة في الوحدة**Node.js test runner**(`tests/unit/`)، ويمكن تشغيلها عبر `npm run test:unit`. كود المصدر ضمن `src/` هو**TypeScript**(`.ts`/`.tsx`)؛ تختلف مساحة العمل `open-sse/` JavaScript (`.js`).
8. تم ضبط صفحة الإعدادات في 5 علامات: الأمان، التوجيه (6 إستراتيجيات عالمية: التعبئة العامة، جولة روبن، p2c، تنظيم غير محدد لاستخدامًا، تحسين التكلفة)، اشتراك (حدود الرسوم المتحركة للتحرير، قطع الدقة، إبداع)، الذكاء الاصطناعي (ميزانية التفكير، متشوق للنظام، ذاكرة التخزين المؤقت السريع)، المتقدمة (الوكيل).## قائمة التحقق من التشغيل
- البناء من المصدر: ``npm run build``
- إنشاء صورة Docker: `docker build -t omniroute .`
- بدء الخدمة والتحقق:
- `الحصول على /api/settings`
- `الحصول على /api/v1/models`
- يجب أن يكون عنوان URL الأساسي لهدف واجهة سطر اللاسلكي هو `http://<host>:20128/v1` عندما يكون `PORT=20128`