Types d'Agents Avancés
Architectures d'agents spécialisées pour différents patterns de raisonnement : ReAct pour le raisonnement étape par étape, Plan-and-Execute pour les tâches complexes multi-étapes, OpenAI Functions pour l'appel structuré d'outils, et Structured Chat pour les interactions basées sur JSON. Plus des toolkits pré-construits pour l'analyse de données SQL et CSV.
ReAct Agent
Raisonnement + Action : pense étape par étape, utilise des outils, observe les résultats
Plan-and-Execute
Planifie d'abord, puis exécute chaque étape. Re-planifie en cas d'échec.
OpenAI Functions
Utilise le format d'appel de fonctions OpenAI pour une invocation précise d'outils
Structured Chat
Appel d'outils basé sur JSON avec validation optionnelle du schéma de sortie
# 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 'orkajs/agent/react';import { OpenAIAdapter } from 'orkajs/adapters/openai';import type { Tool } from 'orkajs'; 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", ... }// ]🔄 Boucle ReAct
- Thought: "Je dois d'abord trouver la population de la France"
- Action: web_search({query: "population France 2024"})
- Observation: "La France compte environ 68 millions d'habitants"
- Thought: "Maintenant je dois multiplier 68 000 000 par 2"
- Action: calculator({expression: "68000000 * 2"})
- Observation: "136000000"
- Action: finish({answer: "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 'orkajs/agent/plan-and-execute'; 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 step✅ Quand Utiliser Plan-and-Execute
- Tâches complexes nécessitant plusieurs étapes
- Workflows de recherche et d'analyse
- Tâches où l'ordre des opérations compte
- Quand vous avez besoin d'un plan d'exécution visible
❌ Quand NE PAS Utiliser
- Requêtes simples en une étape
- Agents conversationnels en temps réel
- Tâches où le chemin est imprévisible
# 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 'orkajs/agent/openai-functions'; 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 'orkajs/agent/structured-chat'; 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# 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 } from 'orkajs/agent/toolkits/sql';import { ReActAgent } from 'orkajs/agent/react'; 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 answer🛡️ Fonctionnalités de Sécurité du Toolkit SQL
- readOnly: Quand activé, seules les requêtes SELECT/WITH/EXPLAIN sont autorisées. INSERT, UPDATE, DELETE sont bloqués.
- maxRows: Ajoute automatiquement LIMIT aux requêtes SELECT pour éviter les requêtes incontrôlées.
- schema: Fournissez le schéma pour que l'agent comprenne la structure de la base sans interroger information_schema.
- 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 } from 'orkajs/agent/toolkits/csv';import { ReActAgent } from 'orkajs/agent/react'; 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 } from 'orkajs/agent/plan-and-execute';import { SQLToolkit } from 'orkajs/agent/toolkits/sql';import { CSVToolkit } from 'orkajs/agent/toolkits/csv'; 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
| Agent | Pattern | Idéal Pour | Fiabilité |
|---|---|---|---|
| Agent (base) | Thought/Action | Utilisation simple d'outils | ⭐⭐⭐ |
| ReAct | Think → Act → Observe | Raisonnement polyvalent | ⭐⭐⭐⭐ |
| Plan-and-Execute | Plan → Execute → Synthesize | Tâches complexes multi-étapes | ⭐⭐⭐⭐⭐ |
| OpenAI Functions | JSON function calls | Invocation précise d'outils | ⭐⭐⭐⭐⭐ |
| Structured Chat | JSON in/out | Sorties structurées, audit | ⭐⭐⭐⭐ |
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 'orkajs/agent/react';import { PlanAndExecuteAgent } from 'orkajs/agent/plan-and-execute';import { OpenAIFunctionsAgent } from 'orkajs/agent/openai-functions';import { StructuredChatAgent } from 'orkajs/agent/structured-chat';import { SQLToolkit } from 'orkajs/agent/toolkits/sql';import { CSVToolkit } from 'orkajs/agent/toolkits/csv'; // ✅ Or import from agent indeximport { ReActAgent, PlanAndExecuteAgent, SQLToolkit } from 'orkajs/agent';