mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 20:32:20 +03:00
- New: open-sse/services/apiKeyRotator.ts — round-robin rotation between primary API key + providerSpecificData.extraApiKeys[] - Modified: open-sse/executors/base.ts — buildHeaders() rotates key using getRotatingApiKey() when extraApiKeys configured - Modified: open-sse/handlers/chatCore.ts — injects connectionId into credentials to enable per-connection rotation index tracking - Modified: providers/[id]/page.tsx — 'Extra API Keys' UI section in EditConnectionModal: add/remove keys, persisted in providerSpecificData T08 (quota window rolling) and T13 (wildcard model routing) confirmed already implemented in accountFallback.ts and wildcardRouter.ts.
157 lines
5.1 KiB
JSON
157 lines
5.1 KiB
JSON
{
|
|
"name": "omniroute",
|
|
"version": "2.4.4",
|
|
"description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
|
|
"type": "module",
|
|
"bin": {
|
|
"omniroute": "bin/omniroute.mjs",
|
|
"omniroute-reset-password": "bin/reset-password.mjs"
|
|
},
|
|
"files": [
|
|
"bin/",
|
|
"app/",
|
|
"open-sse/mcp-server/",
|
|
"src/shared/contracts/",
|
|
"scripts/postinstall.mjs",
|
|
"scripts/native-binary-compat.mjs",
|
|
"README.md",
|
|
"LICENSE"
|
|
],
|
|
"workspaces": [
|
|
"open-sse"
|
|
],
|
|
"engines": {
|
|
"node": ">=18.0.0 <24.0.0"
|
|
},
|
|
"keywords": [
|
|
"ai",
|
|
"router",
|
|
"proxy",
|
|
"openai",
|
|
"claude",
|
|
"anthropic",
|
|
"gemini",
|
|
"fallback",
|
|
"cursor",
|
|
"cline",
|
|
"codex",
|
|
"llm",
|
|
"auto-fallback"
|
|
],
|
|
"license": "MIT",
|
|
"author": "diegosouzapw",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/diegosouzapw/OmniRoute"
|
|
},
|
|
"homepage": "https://omniroute.online",
|
|
"scripts": {
|
|
"dev": "node scripts/run-next.mjs dev",
|
|
"build": "next build --webpack",
|
|
"build:cli": "node scripts/prepublish.mjs",
|
|
"start": "node scripts/run-next.mjs start",
|
|
"lint": "eslint .",
|
|
"electron:dev": "concurrently \"npm run dev\" \"wait-on http://localhost:20128 && cd electron && npm run dev\"",
|
|
"electron:build": "npm run build && cd electron && npm run build",
|
|
"electron:build:win": "npm run build && cd electron && npm run build:win",
|
|
"electron:build:mac": "npm run build && cd electron && npm run build:mac",
|
|
"electron:build:linux": "npm run build && cd electron && npm run build:linux",
|
|
"test": "node --import tsx/esm --test tests/unit/*.test.mjs",
|
|
"test:unit": "node --import tsx/esm --test tests/unit/*.test.mjs",
|
|
"test:plan3": "node --test tests/unit/plan3-p0.test.mjs",
|
|
"test:fixes": "node --test tests/unit/fixes-p1.test.mjs",
|
|
"test:security": "node --test tests/unit/security-fase01.test.mjs",
|
|
"check:cycles": "node scripts/check-cycles.mjs",
|
|
"check:route-validation:t06": "node scripts/check-route-validation.mjs",
|
|
"check:any-budget:t11": "node scripts/check-t11-any-budget.mjs",
|
|
"check:docs-sync": "node scripts/check-docs-sync.mjs",
|
|
"typecheck:core": "tsc --pretty false -p tsconfig.typecheck-core.json",
|
|
"typecheck:noimplicit:core": "tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json",
|
|
"test:integration": "node --import tsx/esm --test tests/integration/*.test.mjs",
|
|
"test:e2e": "node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts",
|
|
"test:protocols:e2e": "node scripts/run-protocol-clients-tests.mjs",
|
|
"test:vitest": "vitest run open-sse/mcp-server/__tests__/*.test.ts open-sse/services/autoCombo/__tests__/*.test.ts",
|
|
"test:ecosystem": "node scripts/run-ecosystem-tests.mjs",
|
|
"test:coverage": "npx c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs",
|
|
"test:all": "npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e",
|
|
"check": "npm run lint && npm run test",
|
|
"prepublishOnly": "npm run build:cli",
|
|
"postinstall": "node scripts/postinstall.mjs",
|
|
"prepare": "husky",
|
|
"system-info": "node scripts/system-info.mjs"
|
|
},
|
|
"dependencies": {
|
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
"@monaco-editor/react": "^4.7.0",
|
|
"bcryptjs": "^3.0.3",
|
|
"better-sqlite3": "^12.6.2",
|
|
"bottleneck": "^2.19.5",
|
|
"dompurify": "^3.3.2",
|
|
"express": "^5.2.1",
|
|
"fetch-socks": "^1.3.2",
|
|
"http-proxy-middleware": "^3.0.5",
|
|
"https-proxy-agent": "^7.0.6",
|
|
"jose": "^6.1.3",
|
|
"lowdb": "^7.0.1",
|
|
"monaco-editor": "^0.55.1",
|
|
"next": "^16.1.6",
|
|
"next-intl": "^4.8.3",
|
|
"node-machine-id": "^1.1.12",
|
|
"open": "^11.0.0",
|
|
"ora": "^9.1.0",
|
|
"pino": "^10.3.1",
|
|
"pino-pretty": "^13.1.3",
|
|
"react": "19.2.4",
|
|
"react-dom": "19.2.4",
|
|
"recharts": "^3.7.0",
|
|
"selfsigned": "^5.5.0",
|
|
"tsx": "^4.21.0",
|
|
"undici": "^7.19.2",
|
|
"uuid": "^13.0.0",
|
|
"wreq-js": "^2.0.1",
|
|
"zod": "^4.3.6",
|
|
"zustand": "^5.0.10",
|
|
"@swc/helpers": "0.5.19"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.58.2",
|
|
"@tailwindcss/postcss": "^4.1.18",
|
|
"@types/bcryptjs": "^3.0.0",
|
|
"@types/better-sqlite3": "^7.6.13",
|
|
"@types/node": "^25.2.3",
|
|
"@types/react": "^19.2.14",
|
|
"@types/react-dom": "^19.2.3",
|
|
"concurrently": "^9.2.1",
|
|
"cross-env": "^10.1.0",
|
|
"eslint": "^9.39.2",
|
|
"eslint-config-next": "16.1.6",
|
|
"husky": "^9.1.7",
|
|
"lint-staged": "^16.2.7",
|
|
"prettier": "^3.8.1",
|
|
"tailwindcss": "^4",
|
|
"typescript": "^5.9.3",
|
|
"typescript-eslint": "^8.56.0",
|
|
"vitest": "^4.0.18",
|
|
"wait-on": "^9.0.4"
|
|
},
|
|
"lint-staged": {
|
|
"*.{js,jsx,ts,tsx,mjs}": [
|
|
"prettier --write",
|
|
"eslint --fix --no-error-on-unmatched-pattern"
|
|
],
|
|
"*.{json,md,yml,yaml,css}": [
|
|
"prettier --write"
|
|
]
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"@parcel/watcher",
|
|
"@swc/core",
|
|
"better-sqlite3",
|
|
"esbuild",
|
|
"omniroute",
|
|
"sharp"
|
|
]
|
|
}
|
|
}
|