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 requestsconst cheapPool = new LoadBalancerLLM({ adapters: [miniAdapter1, miniAdapter2], strategy: 'round_robin',}); // Fallback chain for complex requestsconst powerfulChain = new FallbackLLM({ adapters: [gpt4oAdapter, claudeAdapter],}); // Router that picks the right strategyconst 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}); // Usageconst 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: LLMAdapterAdaptateur 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 responseconst 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 answerParamè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?: LLMAdapterRequis 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 raceParamètres de RaceLLM
adapters: LLMAdapter[]Tableau de modèles à faire concourir. Tous sont appelés simultanément.
timeout?: numberTemps 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 modelconst 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 keysfor (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
| Orchestrateur | Cas d'Usage | Appels API | Latence |
|---|---|---|---|
| RouterLLM | Optimisation des coûts, routage par tâche | 1 | Modèle unique |
| ConsensusLLM | Haute précision, décisions critiques | N + 1 (judge) | Parallèle + juge |
| RaceLLM | Latence minimale | N (parallel) | Modèle le plus rapide |
| LoadBalancerLLM | Éviter les limites de débit, haut débit | 1 | Modèle unique |
Imports Tree-shakeable
Importez uniquement ce dont vous avez besoin pour minimiser la taille du bundle :
// ✅ Import only what you needimport { 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 indeximport { RouterLLM, ConsensusLLM, RaceLLM, LoadBalancerLLM } from 'orkajs/orchestration';