Types d'Agents Avancés
Architectures d'agents spécialisées pour différents patterns de raisonnement : ReAct, Plan-and-Execute, OpenAI Functions, Structured Chat et Streaming Tool Calls. Plus destoolkits SQL et CSV pré-construits.
ReAct Agent
IterativeBoucle dynamique Pensée → Action → Observation. Idéal pour les tâches interactives et imprévisibles.
Plan-and-Execute
StructuralDécompose les objectifs en liste de tâches avant d'agir. Supérieur pour les workflows complexes et longs.
OpenAI Functions
OptimizedExploite le schéma JSON natif du modèle pour une fiabilité d'invocation d'outils quasi parfaite.
Structured Chat
ValidatedImpose un formatage JSON strict avec validation de schéma. Idéal pour les systèmes multi-outils.
StreamingToolAgent
Real-timeStream les tokens en temps réel tout en exécutant les outils en parallèle. Les utilisateurs voient le modèle réfléchir.
# Agent ReAct — Raisonnement + Action
L'agent ReAct suit la boucle Pensée → Action → Observation. À chaque étape, il raisonne sur ce qu'il faut faire, effectue une action (appelle un outil), observe le résultat et répète jusqu'à pouvoir fournir une réponse finale. C'est le pattern d'agent le plus polyvalent et il fonctionne bien pour la plupart des tâches.
import { ReActAgent } from '@orka-js/agent';import { OpenAIAdapter } from '@orka-js/openai';import type { Tool } from '@orka-js/tools'; const llm = new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY! }); // Define toolsconst searchTool: Tool = { name: 'web_search', description: 'Search the web for current information', parameters: [ { name: 'query', type: 'string', description: 'Search query', required: true } ], execute: async (input) => { const results = await mySearchAPI(input.query as string); return { output: results }; }}; const calculatorTool: Tool = { name: 'calculator', description: 'Perform mathematical calculations', parameters: [ { name: 'expression', type: 'string', description: 'Math expression to evaluate', required: true } ], execute: async (input) => { const result = eval(input.expression as string); // Use a safe math parser in production return { output: String(result) }; }}; // Create ReAct agentconst agent = new ReActAgent( { goal: 'Help users find information and perform calculations', tools: [searchTool, calculatorTool], maxSteps: 10, verbose: true, // Logs each Thought/Action/Observation policy: { rules: [ 'Always verify information from multiple sources', 'Show your calculations step by step' ] } }, llm); const result = await agent.run('What is the population of France times 2?'); console.log(result.output);// "The population of France is approximately 68 million. 68,000,000 × 2 = 136,000,000." console.log(result.steps);// [// { thought: "I need to find the population of France", action: "web_search", ... },// { thought: "Now I need to multiply by 2", action: "calculator", ... }// ]Trace d'Exécution Cognitive
Pattern: Reasoning + Acting (ReAct)
"Chercher d'abord la population de la France"web_search({query: "population..."})"68 millions d'habitants""Calculer 68M * 2"calculator({expression: "..."})136,000,000# Agent Plan-and-Execute
L'agent Plan-and-Execute sépare la planification de l'exécution. D'abord, il crée un plan complet d'étapes. Ensuite, il exécute chaque étape une par une. Si une étape échoue et que replanOnFailure est activé, il ajuste dynamiquement le plan restant. Cette architecture est idéale pour les tâches complexes multi-étapes où avoir une feuille de route claire améliore la fiabilité.
import { PlanAndExecuteAgent } from '@orka-js/agent'; const agent = new PlanAndExecuteAgent( { goal: 'Research and analyze data to answer complex questions', tools: [searchTool, calculatorTool, databaseTool], maxSteps: 15, replanOnFailure: true, // Dynamically adjust plan if a step fails }, llm); const result = await agent.run( 'Compare the GDP per capita of France, Germany, and Japan. Which has grown the most in the last 5 years?'); console.log(result.output);// Comprehensive comparison with data and analysis console.log(result.plan);// [// { id: 1, description: "Search for France GDP per capita data", status: "completed", result: "..." },// { id: 2, description: "Search for Germany GDP per capita data", status: "completed", result: "..." },// { id: 3, description: "Search for Japan GDP per capita data", status: "completed", result: "..." },// { id: 4, description: "Calculate growth rates for each country", status: "completed", result: "..." },// { id: 5, description: "Compare and determine highest growth", status: "completed", result: "..." }// ] console.log(result.steps);// Detailed execution trace with timing and token usage per stepScénarios Optimaux
- Raisonnement complexe multi-étapes
- Recherche et analyse approfondie
- Ordre d'opérations strict
- Feuilles de route observables
Contre-indications
- Requêtes simples en une étape
- UX conversationnelle temps réel
- Chemins de branchement imprévisibles
# Agent OpenAI Functions
Utilise le format d'appel de fonctions OpenAI pour une invocation d'outils précise et structurée. Les outils sont décrits comme des schémas JSON, et le LLM répond avec des appels de fonctions structurés au lieu d'un parsing de texte libre. Cela résulte en une utilisation d'outils plus fiable avec moins d'erreurs de parsing.
import { OpenAIFunctionsAgent } from '@orka-js/agent'; const agent = new OpenAIFunctionsAgent( { goal: 'Help users manage their tasks and calendar', tools: [ { name: 'create_event', description: 'Create a calendar event', parameters: [ { name: 'title', type: 'string', description: 'Event title', required: true }, { name: 'date', type: 'string', description: 'Event date (YYYY-MM-DD)', required: true }, { name: 'time', type: 'string', description: 'Event time (HH:MM)', required: false }, ], execute: async (input) => { await calendarAPI.create(input); return { output: `Event "${input.title}" created for ${input.date}` }; } }, { name: 'list_events', description: 'List calendar events for a date range', parameters: [ { name: 'start_date', type: 'string', description: 'Start date', required: true }, { name: 'end_date', type: 'string', description: 'End date', required: true }, ], execute: async (input) => { const events = await calendarAPI.list(input.start_date, input.end_date); return { output: JSON.stringify(events) }; } } ], // Optional: provide custom function definitions (auto-generated from tools if omitted) // functions: [{ name: 'create_event', description: '...', parameters: { ... } }], maxSteps: 5, }, llm); const result = await agent.run('Schedule a team meeting for next Monday at 2pm'); console.log(result.output);// "I've created a 'Team Meeting' event for 2024-03-18 at 14:00." console.log(result.metadata);// { agentType: 'openai-functions', stepsUsed: 1 }Schémas de Fonctions Auto-générés
Si vous ne fournissez pas de définitions de fonctions personnalisées, l'agent convertit automatiquement vos définitions Tool en schémas de fonctions compatibles OpenAI :
// Your Tool definition:{ name: 'create_event', parameters: [{ name: 'title', type: 'string', required: true }] } // Auto-generated OpenAI function schema:{ "name": "create_event", "parameters": { "type": "object", "properties": { "title": { "type": "string" } }, "required": ["title"] }}# Agent Structured Chat
L'agent Structured Chat communique entièrement via JSON. Chaque réponse — qu'il s'agisse d'un appel d'outil ou d'une réponse finale — est un objet JSON structuré. Cela le rend très prévisible et facile à intégrer dans des systèmes qui nécessitent des sorties structurées. Vous pouvez optionnellement définir un schéma de sortie pour imposer le format de la réponse finale.
import { StructuredChatAgent } from '@orka-js/agent'; const agent = new StructuredChatAgent( { goal: 'Analyze customer support tickets and route them', tools: [ { name: 'classify_ticket', description: 'Classify a support ticket by category and urgency', parameters: [ { name: 'text', type: 'string', description: 'Ticket text', required: true } ], execute: async (input) => { // Classification logic return { output: JSON.stringify({ category: 'billing', urgency: 'high' }) }; } }, { name: 'route_ticket', description: 'Route a ticket to the appropriate team', parameters: [ { name: 'category', type: 'string', description: 'Ticket category', required: true }, { name: 'urgency', type: 'string', description: 'Urgency level', required: true } ], execute: async (input) => { return { output: `Routed to ${input.category} team (priority: ${input.urgency})` }; } } ], // Optional: enforce output format outputSchema: { type: 'object', properties: { category: { type: 'string' }, urgency: { type: 'string' }, team: { type: 'string' }, summary: { type: 'string' } } }, maxSteps: 5, }, llm); const result = await agent.run('Customer says: "I was charged twice for my subscription!"'); console.log(result.output);// "Classified as billing/high urgency. Routed to billing team with priority handling." console.log(result.steps);// All steps are structured JSON — easy to log and audit# StreamingToolAgent — Streaming en Temps Réel + Outils
StreamingToolAgent stream les tokens LLM en temps réel tout en exécutant les outils en parallèle. Contrairement à ReActAgent (qui attend la réponse complète), il yield les tokens immédiatement — les utilisateurs voient le modèle « réfléchir » pendant que les outils s'exécutent. La mémoire est chargée au début de chaque appel et sauvegardée après la complétion, maintenant le contexte conversationnel entre les requêtes.
import { StreamingToolAgent } from '@orka-js/agent';import { OpenAIAdapter } from '@orka-js/openai';import { Memory } from '@orka-js/memory-store'; const llm = new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY! }); const searchTool = { name: 'search_products', description: 'Search for products matching a query', parameters: [ { name: 'query', type: 'string', description: 'Search query', required: true }, { name: 'maxPrice', type: 'number', description: 'Maximum price filter', required: false }, ], execute: async ({ query, maxPrice }) => { const results = await productDB.search(query as string, maxPrice as number); return { output: JSON.stringify(results) }; },}; // Optional: pass a Memory instance for conversation persistenceconst memory = new Memory(); const agent = new StreamingToolAgent( { goal: 'Help customers find products that match their needs', tools: [searchTool], maxSteps: 5, verbose: true, // Logs each tool call to console }, llm, memory, // Agent remembers context across requests); // ─── Streaming run ──────────────────────────────────────────────────────────── for await (const event of agent.runStream('Find me a Bluetooth headphone under 200€')) { switch (event.type) { case 'token': process.stdout.write(event.token); // LLM thinking in real time break; case 'tool_call': console.log(`\n[→] ${event.name}(${event.arguments})`); break; case 'tool_result': console.log(`[←] ${event.result}`); // Tool output before final answer break; case 'done': console.log('\n[✓]', event.content); break; case 'error': console.error('[✗]', event.message); break; }} // ─── Subsequent call — agent remembers the previous exchange ────────────────── for await (const event of agent.runStream('What about under 150€?')) { // Agent knows the context: "Bluetooth headphone" from previous turn if (event.type === 'token') process.stdout.write(event.token);} // ─── Non-streaming shortcut ─────────────────────────────────────────────────── const result = await agent.run('Show me the top-rated option');console.log(result.output); // Final answerconsole.log(result.steps); // Tool calls with observationsconsole.log(result.totalTokens); // Token usageFlux d'Événements Stream
Par cycle d'appel LLM
Persistance Mémoire
Passez une instance Memory au constructeur. L'historique est automatiquement chargé avant chaque runStream() et sauvegardé après chaque complétion.
Exécution d'Outils en Parallèle
Quand le LLM demande plusieurs outils simultanément, tous sont exécutés en parallèle via Promise.all(), puis les résultats sont injectés dans le stream.
# Toolkits d'Agents
Les toolkits sont des collections pré-construites d'outils pour les tâches courantes d'analyse de données. Au lieu de définir les outils manuellement, utilisez un toolkit pour équiper instantanément n'importe quel agent avec des capacités spécifiques à un domaine.
- Toolkit SQL
Fournit des outils pour interroger des bases de données SQL : exécuter des requêtes, inspecter le schéma et lister les tables. Supporte le mode lecture seule pour la sécurité et l'injection automatique de LIMIT.
import { SQLToolkit, ReActAgent } from '@orka-js/agent'; const sqlToolkit = new SQLToolkit({ execute: async (query: string) => { // Connect to your database const result = await db.query(query); return JSON.stringify(result.rows); }, schema: ` CREATE TABLE users(id INT, name VARCHAR, email VARCHAR, created_at TIMESTAMP); CREATE TABLE orders(id INT, user_id INT, amount DECIMAL, status VARCHAR, created_at TIMESTAMP); CREATE TABLE products(id INT, name VARCHAR, price DECIMAL, category VARCHAR); `, readOnly: true, // Only SELECT queries allowed maxRows: 50 // Auto-inject LIMIT 50}); // Use with any agent typeconst agent = new ReActAgent( { goal: 'Answer questions about the database by writing SQL queries', tools: sqlToolkit.tools, // Includes: sql_query, sql_schema, sql_list_tables maxSteps: 8, }, llm); const result = await agent.run('How many orders were placed last month? What was the total revenue?'); // The agent will:// 1. Use sql_schema to understand the tables// 2. Write and execute SQL queries// 3. Synthesize the results into a natural language answerSystème de Garde-Fous SQL
Zero-Trust Agentic Access
readOnlyPolicyImmutable Access
Bloque strictement les opérations DML. Autorise uniquement les requêtes analytiques.
maxRowsPerformanceRuntime Quota
Impose une pagination stricte. Ajoute LIMIT pour éviter l'épuisement de la mémoire.
schemaOptimizationSchema Mapping
Cache de métadonnées en mémoire. Empêche l'agent d'analyser les tables système.
- Toolkit CSV
Fournit des outils pour analyser des données CSV en mémoire : recherche, filtrage et agrégation. Pas de base de données requise — passez simplement vos données CSV comme une chaîne de caractères.
import { CSVToolkit, ReActAgent } from '@orka-js/agent'; const csvData = `name,department,salary,start_dateAlice,Engineering,95000,2021-03-15Bob,Marketing,72000,2020-06-01Charlie,Engineering,105000,2019-01-10Diana,Sales,68000,2022-09-20Eve,Engineering,88000,2023-02-01`; const csvToolkit = new CSVToolkit({ data: csvData, separator: ',' // default}); const agent = new ReActAgent( { goal: 'Analyze employee data and answer questions', tools: csvToolkit.tools, // Includes: csv_info, csv_search, csv_filter, csv_aggregate maxSteps: 8, }, llm); // Ask questions about the dataconst result = await agent.run('What is the average salary in Engineering? Who earns the most?'); // The agent will use csv_filter and csv_aggregate tools to find the answerconsole.log(result.output);// "The average salary in Engineering is $96,000. Charlie earns the most at $105,000." // CSV Toolkit tools:// - csv_info: Get column names, row count, sample data// - csv_search: Search for rows by column value (partial match)// - csv_filter: Filter rows with operators (=, !=, >, <, >=, <=, contains)// - csv_aggregate: count, sum, avg, min, max, distinct# Combiner Agents et Toolkits
Vous pouvez combiner plusieurs toolkits et outils personnalisés avec n'importe quel type d'agent :
import { PlanAndExecuteAgent, SQLToolkit, CSVToolkit } from '@orka-js/agent'; const sqlToolkit = new SQLToolkit({ execute: db.query, readOnly: true });const csvToolkit = new CSVToolkit({ data: reportCSV }); // Combine toolkit tools with custom toolsconst allTools = [ ...sqlToolkit.tools, ...csvToolkit.tools, myCustomSearchTool, myCalculatorTool,]; const agent = new PlanAndExecuteAgent( { goal: 'Cross-reference database records with CSV reports', tools: allTools, maxSteps: 15, replanOnFailure: true, }, llm); const result = await agent.run( 'Compare the sales figures in the CSV report with the orders table in the database. Are there any discrepancies?');Comparaison des Types d'Agents
| Classe d'Agent | Pattern Opérationnel | Cas d'Usage Cible | Indice de Fiabilité |
|---|---|---|---|
| Agent (Base) | Thought / Action | Automatisation simple | 60% |
| ReAct | Think → Act → Observe | Raisonnement dynamique | 85% |
| Plan-and-Execute | Plan → Exec → Re-plan | Recherche multi-étapes | 98% |
| OpenAI Functions | Native Tool Binding | Outils critiques | 99% |
| Structured Chat | JSON Strict I/O | Sorties auditables | 90% |
| StreamingToolAgent | Stream → Tool → Stream | Chat UX temps réel | 92% |
Bonnes Pratiques
1. Choisissez le Bon Type d'Agent
Utilisez ReAct pour les tâches générales, Plan-and-Execute pour les workflows complexes multi-étapes, OpenAI Functions quand vous avez besoin d'appels d'outils précis, et Structured Chat quand vous avez besoin de sorties JSON.
2. Définissez des Limites Appropriées
Définissez toujours maxSteps pour éviter les boucles infinies. Utilisez les policies pour restreindre l'accès aux outils et imposer des règles.
3. Utilisez les Toolkits pour l'Analyse de Données
SQLToolkit et CSVToolkit fournissent des outils éprouvés. Utilisez toujours le mode readOnly pour SQL en production. Combinez plusieurs toolkits pour l'analyse croisée de données.
4. Surveillez avec le Mode verbose
Activez verbose: true sur ReActAgent pendant le développement pour voir chaque Pensée/Action/Observation dans la console. Tous les agents retournent des étapes détaillées pour le monitoring en production.
Imports Tree-shakeable
// ✅ Import only what you needimport { ReActAgent } from '@orka-js/agent';import { PlanAndExecuteAgent } from '@orka-js/agent';import { OpenAIFunctionsAgent } from '@orka-js/agent';import { StructuredChatAgent } from '@orka-js/agent';import { StreamingToolAgent } from '@orka-js/agent'; // v1.5.0+import { SQLToolkit, CSVToolkit } from '@orka-js/agent'; // ✅ Or combine in one importimport { ReActAgent, PlanAndExecuteAgent, StreamingToolAgent, SQLToolkit } from '@orka-js/agent';