OrkaJS
Orka.JS

Orchestration Multi-Modèle

Routez, faites la course, équilibrez et construisez un consensus entre plusieurs fournisseurs LLM avec Orka AI.

RouterLLM

Routez les requêtes vers différents modèles selon des conditions

new RouterLLM({
routes: [
{ condition: (p) => p.length > 500, adapter: gpt4o },
{ condition: (p) => p.includes('code'), adapter: gpt4o },
],
defaultAdapter: gpt4oMini,
})

ConsensusLLM

Interrogez plusieurs modèles et sélectionnez la meilleure réponse

new ConsensusLLM({
adapters: [gpt4oMini, gpt4o],
strategy: 'best_score', // 'majority' | 'merge'
judge: gpt4o,
})

RaceLLM

Interrogez plusieurs modèles en parallèle, retournez le plus rapide

new RaceLLM({
adapters: [openai, anthropic],
timeout: 10000,
})

LoadBalancerLLM

Répartissez les requêtes entre plusieurs adaptateurs

new LoadBalancerLLM({
adapters: [key1, key2, key3],
strategy: 'round_robin', // 'random' | 'least_tokens'
})

# Combiner les Stratégies

// Load-balanced pool for simple requests
const cheapPool = new LoadBalancerLLM({
adapters: [miniAdapter1, miniAdapter2],
strategy: 'round_robin',
});
 
// Fallback chain for complex requests
const powerfulChain = new FallbackLLM({
adapters: [gpt4oAdapter, claudeAdapter],
});
 
// Router that picks the right strategy
const llm = new RouterLLM({
routes: [
{ condition: (p) => p.length > 1000, adapter: powerfulChain },
],
defaultAdapter: cheapPool,
});

💡 Astuce

Tous les adaptateurs d'orchestration implémentent LLMAdapter, ils peuvent donc être utilisés comme paramètre llm dans createOrka(), à l'intérieur de FallbackLLM, ou partout où un adaptateur est attendu.

# RouterLLM — Routage Intelligent des Requêtes

RouterLLM évalue chaque prompt par rapport à une liste de conditions et route vers le modèle approprié. Les conditions sont évaluées dans l'ordre — la première condition correspondante gagne. Si aucune condition ne correspond, le defaultAdapter est utilisé.

import { RouterLLM } from 'orkajs/orchestration';
import { OpenAIAdapter } from 'orkajs/adapters/openai';
 
const gpt4o = new OpenAIAdapter({ apiKey: '...', model: 'gpt-4o' });
const gpt4oMini = new OpenAIAdapter({ apiKey: '...', model: 'gpt-4o-mini' });
const claude = new AnthropicAdapter({ apiKey: '...', model: 'claude-3-sonnet' });
 
const router = new RouterLLM({
routes: [
// Route long prompts to GPT-4o (better at complex reasoning)
{ condition: (prompt) => prompt.length > 2000, adapter: gpt4o },
 
// Route code-related prompts to Claude (strong at code)
{ condition: (prompt) => /(code|function|class|import)/i.test(prompt), adapter: claude },
 
// Route math/calculation prompts to GPT-4o
{ condition: (prompt) => /(calculate|compute|math|equation)/i.test(prompt), adapter: gpt4o },
],
defaultAdapter: gpt4oMini, // Fast and cheap for simple queries
});
 
// Usage
const result = await router.generate('Write a Python function to sort a list');
// → Routed to Claude (matches 'function' keyword)

Paramètres de RouterLLM

routes: Route[]

Tableau de { condition: (prompt) => boolean, adapter: LLMAdapter }. Évalué dans l'ordre.

defaultAdapter: LLMAdapter

Adaptateur de secours quand aucune condition de route ne correspond.

# ConsensusLLM — Accord Multi-Modèle

ConsensusLLM interroge plusieurs modèles et combine leurs réponses en utilisant l'une des trois stratégies : best_score (un modèle juge choisit la meilleure), majority (la réponse la plus courante gagne), ou merge (combiner toutes les réponses en une).

import { ConsensusLLM } from 'orkajs/orchestration';
 
// Strategy 1: best_score — Judge picks the best response
const consensus = new ConsensusLLM({
adapters: [gpt4oMini, claude, mistral],
strategy: 'best_score',
judge: gpt4o, // A more powerful model evaluates responses
judgePrompt: 'Rate these responses 1-10 for accuracy and helpfulness. Return the best one.',
});
 
// Strategy 2: majority — Most common answer wins (good for factual questions)
const majorityConsensus = new ConsensusLLM({
adapters: [gpt4oMini, claude, mistral],
strategy: 'majority',
});
 
// Strategy 3: merge — Combine all responses (good for creative tasks)
const mergeConsensus = new ConsensusLLM({
adapters: [gpt4oMini, claude],
strategy: 'merge',
mergePrompt: 'Combine these responses into a comprehensive answer.',
});
 
const result = await consensus.generate('What is the capital of France?');
// All 3 models are queried in parallel, then judge picks the best answer

Paramètres de ConsensusLLM

adapters: LLMAdapter[]

Tableau de modèles à interroger. Tous sont appelés en parallèle.

strategy: 'best_score' | 'majority' | 'merge'

Comment sélectionner/combiner les réponses. Défaut : best_score.

judge?: LLMAdapter

Requis pour 'best_score'. Le modèle qui évalue et choisit la meilleure réponse.

# RaceLLM — La Réponse la Plus Rapide Gagne

RaceLLM interroge plusieurs modèles en parallèle et retourne la première réponse réussie. Idéal pour les applications sensibles à la latence où vous voulez le modèle disponible le plus rapide.

import { RaceLLM } from 'orkajs/orchestration';
 
const race = new RaceLLM({
adapters: [openai, anthropic, mistral],
timeout: 10000, // 10s max wait time
});
 
const result = await race.generate('Quick question: what is 2+2?');
// Returns the first model to respond
// Other requests are cancelled (if supported by the adapter)
 
console.log(result.metadata?.adapter); // Which adapter won the race

Paramètres de RaceLLM

adapters: LLMAdapter[]

Tableau de modèles à faire concourir. Tous sont appelés simultanément.

timeout?: number

Temps maximum d'attente pour une réponse (ms). Défaut : 30000.

# LoadBalancerLLM — Répartir la Charge

LoadBalancerLLM répartit les requêtes entre plusieurs adaptateurs (souvent le même modèle avec différentes clés API) pour éviter les limites de débit et améliorer le débit.

import { LoadBalancerLLM } from 'orkajs/orchestration';
 
// Multiple API keys for the same model
const key1 = new OpenAIAdapter({ apiKey: process.env.OPENAI_KEY_1! });
const key2 = new OpenAIAdapter({ apiKey: process.env.OPENAI_KEY_2! });
const key3 = new OpenAIAdapter({ apiKey: process.env.OPENAI_KEY_3! });
 
const balancer = new LoadBalancerLLM({
adapters: [key1, key2, key3],
strategy: 'round_robin', // Rotate through adapters
});
 
// Strategies:
// - 'round_robin': Cycle through adapters in order (1, 2, 3, 1, 2, 3...)
// - 'random': Pick a random adapter each time
// - 'least_tokens': Pick the adapter that has used the fewest tokens
 
// Make 100 requests — they'll be distributed across all 3 keys
for (let i = 0; i < 100; i++) {
await balancer.generate('Hello!');
}

Paramètres de LoadBalancerLLM

adapters: LLMAdapter[]

Tableau d'adaptateurs pour répartir la charge.

strategy: 'round_robin' | 'random' | 'least_tokens'

Comment sélectionner le prochain adaptateur. Défaut : round_robin.

# Comparaison

OrchestrateurCas d'UsageAppels APILatence
RouterLLMOptimisation des coûts, routage par tâche1Modèle unique
ConsensusLLMHaute précision, décisions critiquesN + 1 (judge)Parallèle + juge
RaceLLMLatence minimaleN (parallel)Modèle le plus rapide
LoadBalancerLLMÉviter les limites de débit, haut débit1Modèle unique

Imports Tree-shakeable

Importez uniquement ce dont vous avez besoin pour minimiser la taille du bundle :

// ✅ Import only what you need
import { RouterLLM } from 'orkajs/orchestration/router';
import { ConsensusLLM } from 'orkajs/orchestration/consensus';
import { RaceLLM } from 'orkajs/orchestration/race';
import { LoadBalancerLLM } from 'orkajs/orchestration/load-balancer';
 
// ✅ Or import from index
import { RouterLLM, ConsensusLLM, RaceLLM, LoadBalancerLLM } from 'orkajs/orchestration';