VerdantClaw-Final / scripts /omniroute.js
TheEdict's picture
Initial deployment to VerdantClaw-Final
09eb9d4 verified
Raw
History Blame Contribute Delete
7.69 kB
/**
* OmniRoute v2 β€” The Polyglot Intelligence Engine
*
* Features:
* - Tiered Fallback: Big Names (T1) -> Open Weights (T2) -> Free (T3).
* - Multi-API Translation: Speaks OpenAI, Anthropic Messages, and Google Gemini.
* - Advanced Account Rotation: Round-robin across multiple keys per provider.
* - Per-Key Cooldowns: Tracks bans/rate-limits at the individual key level.
*/
const express = require('express');
const fetch = require('node-fetch');
const fs = require('fs');
const path = require('path');
const app = express();
app.use(express.json());
// ─── Load Masterfile ──────────────────────────────────────────────
const configPath = path.join(__dirname, '..', 'config', 'omniroute-masterfile.json');
let masterfile = { providers: {}, model: {}, routing: {} };
function loadConfig() {
if (fs.existsSync(configPath)) {
const raw = fs.readFileSync(configPath, 'utf-8');
const resolved = raw.replace(/\$\{(\w+)\}/g, (_, key) => process.env[key] || '');
masterfile = JSON.parse(resolved);
console.log(`πŸ“‘ OmniRoute: Tiered Masterfile loaded.`);
}
}
loadConfig();
// ─── Port & Global State ─────────────────────────────────────────
const PORT = process.env.GRAPH_VIEWER_PORT ? 20128 : (process.env.PORT || 20128);
const keyRotation = {}; // { providerName: lastUsedKeyIndex }
const keyCooldowns = {}; // { "provider_key": timestamp }
// ─── Intelligence: The Polyglot Translators ───────────────────────
/**
* Translates OpenAI-format messages to Anthropic Messages format.
*/
function toAnthropic(messages) {
const system = messages.find(m => m.role === 'system')?.content || '';
const contents = messages.filter(m => m.role !== 'system').map(m => ({
role: m.role === 'assistant' ? 'assistant' : 'user',
content: m.content
}));
return { system, messages: contents };
}
/**
* Translates OpenAI-format messages to Google Gemini format.
*/
function toGemini(messages) {
return {
contents: messages.map(m => ({
role: m.role === 'assistant' ? 'model' : 'user',
parts: [{ text: m.content }]
}))
};
}
// ─── Logic: Key & Provider Management ───────────────────────────
function getAvailableKeys(providerName) {
const base = `${providerName.toUpperCase()}_API_KEY`;
const keys = [];
if (process.env[base] && process.env[base] !== 'REPLACE_ME') keys.push(process.env[base]);
for (let i = 2; i <= 10; i++) {
const k = process.env[`${base}_${i}`];
if (k && k !== 'REPLACE_ME') keys.push(k);
}
return keys;
}
function getKeyCooldown(provider, key) {
const composite = `${provider}_${key.slice(-5)}`;
if (keyCooldowns[composite] && Date.now() < keyCooldowns[composite]) return true;
return false;
}
function setKeyCooldown(provider, key, seconds = 60) {
const composite = `${provider}_${key.slice(-5)}`;
keyCooldowns[composite] = Date.now() + (seconds * 1000);
console.log(`⏸️ Key ${composite} limited for ${seconds}s`);
}
/**
* Intelligence: Tiered Candidate Finder
*/
function findCandidates(requestedModel) {
const candidates = [];
for (const [pName, pConfig] of Object.entries(masterfile.providers)) {
const keys = getAvailableKeys(pName);
if (keys.length === 0) continue;
for (const model of pConfig.models) {
if (requestedModel && model.id !== requestedModel) continue;
candidates.push({
provider: pName,
model: model.id,
api: pConfig.api,
baseUrl: pConfig.baseUrl,
tier: pConfig.tier || 3,
priority: model.priority || 99,
keys
});
}
}
// Tier 1 (Paid) -> Tier 2 (Open Weight) -> Tier 3 (Free)
candidates.sort((a, b) => a.tier - b.tier || a.priority - b.priority);
return candidates;
}
// ─── The Main Execution Engine ───────────────────────────────────
app.post('/v1/chat/completions', async (req, res) => {
const { model: reqModel, messages, ...options } = req.body;
const chain = reqModel ? [reqModel] : [masterfile.model.primary, masterfile.model.fallback, masterfile.model.review];
for (const targetModel of chain) {
const candidates = findCandidates(targetModel);
for (const c of candidates) {
// Rotation: Start from a fresh key each time
if (!keyRotation[c.provider]) keyRotation[c.provider] = 0;
for (let i = 0; i < c.keys.length; i++) {
const keyIdx = (keyRotation[c.provider] + i) % c.keys.length;
const key = c.keys[keyIdx];
if (getKeyCooldown(c.provider, key)) continue;
try {
console.log(`πŸ“‘ [Tier ${c.tier}] ${c.provider} -> ${targetModel}`);
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 60000);
let body, url, headers = { 'Authorization': `Bearer ${key}`, 'Content-Type': 'application/json' };
// Polyglot: Translation Logic
if (c.api === 'anthropic-messages') {
const translated = toAnthropic(messages);
url = `${c.baseUrl}/messages`;
headers['x-api-key'] = key;
delete headers['Authorization'];
body = { model: c.model, ...translated, max_tokens: options.max_tokens || 4096 };
} else if (c.api === 'google-gemini') {
const translated = toGemini(messages);
url = `${c.baseUrl}/${c.model}:generateContent?key=${key}`;
delete headers['Authorization'];
body = translated;
} else {
// Default: OpenAI Format
url = `${c.baseUrl}/chat/completions`;
body = { model: c.model, messages, ...options };
}
const response = await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(body),
signal: controller.signal
});
clearTimeout(timeout);
if (response.status === 429) {
setKeyCooldown(c.provider, key, 120);
continue;
}
if (!response.ok) {
console.warn(`⚠️ ${c.provider} failed (${response.status})`);
continue;
}
const data = await response.json();
// Update rotation for next time
keyRotation[c.provider] = (keyIdx + 1) % c.keys.length;
// Return standardized response
return res.json(data);
} catch (e) {
console.error(`❌ ${c.provider} error: ${e.message}`);
continue;
}
}
}
}
res.status(503).json({ error: "All tiers exhausted. Check API keys or cooldowns." });
});
// ─── System Info & Management ────────────────────────────────────
app.get('/v1/models', (req, res) => {
const list = [];
for (const [pName, pConfig] of Object.entries(masterfile.providers)) {
const keys = getAvailableKeys(pName);
pConfig.models.forEach(m => list.push({
id: m.id,
tier: pConfig.tier,
provider: pName,
active_keys: keys.length,
available: !keys.every(k => getKeyCooldown(pName, k))
}));
}
res.json({ data: list.sort((a,b) => a.tier - b.tier) });
});
app.listen(PORT, '0.0.0.0', () => {
console.log(`πŸš€ OmniRoute v2: Polyglot Intelligence Engine on port ${PORT}`);
});