Schéma YAML du bloc Loop
Référence de configuration YAML pour les blocs Loop
Définition du schéma
type: object
required:
- type
- name
- inputs
- connections
properties:
type:
type: string
enum: [loop]
description: Block type identifier
name:
type: string
description: Display name for this loop block
inputs:
type: object
required:
- loopType
properties:
loopType:
type: string
enum: [for, forEach]
description: Type of loop to execute
iterations:
type: number
description: Number of iterations (for 'for' loops)
minimum: 1
maximum: 1000
collection:
type: string
description: Collection to iterate over (for 'forEach' loops)
maxConcurrency:
type: number
description: Maximum concurrent executions
default: 1
minimum: 1
maximum: 10
connections:
type: object
required:
- loop
properties:
loop:
type: object
required:
- start
properties:
start:
type: string
description: Target block ID to execute inside the loop
end:
type: string
description: Target block ID for loop completion (optional)
success:
type: string
description: Target block ID after loop completion (alternative format)
error:
type: string
description: Target block ID for error handlingConfiguration des connexions
Les blocs Loop utilisent un format de connexion spécial avec une section loop :
connections:
loop:
start: <string> # ID du bloc cible à exécuter dans la boucle
end: <string> # ID du bloc cible après la fin de la boucle (optionnel)
error: <string> # ID du bloc cible pour la gestion des erreurs (optionnel)Format alternatif (hérité) :
connections:
success: <string> # ID du bloc cible après la fin de la boucle
error: <string> # ID du bloc cible pour la gestion des erreurs (optionnel)Configuration des blocs enfants
Les blocs à l'intérieur d'une boucle doivent avoir leur parentId défini sur l'ID du bloc Loop :
loop-1:
type: loop
name: "Process Items"
inputs:
loopType: forEach
collection: <start.items>
connections:
loop:
start: process-item
end: final-results
# Bloc enfant à l'intérieur de la boucle
process-item:
type: agent
name: "Process Item"
parentId: loop-1 # Référence le bloc Loop
inputs:
systemPrompt: "Process this item"
userPrompt: <loop.currentItem>
model: gpt-4o
apiKey: '{{OPENAI_API_KEY}}'Exemples
Boucle For (itérations fixes)
countdown-loop:
type: loop
name: "Countdown Loop"
inputs:
loopType: for
iterations: 5
connections:
loop:
start: countdown-agent
end: countdown-complete
countdown-agent:
type: agent
name: "Countdown Agent"
parentId: countdown-loop
inputs:
systemPrompt: "Generate a countdown message"
userPrompt: "Count down from 5. Current number: <loop.index>"
model: gpt-4o
apiKey: '{{OPENAI_API_KEY}}'Boucle ForEach (traitement de collection)
email-processor-loop:
type: loop
name: "Email Processor Loop"
inputs:
loopType: forEach
collection: <start.emails>
connections:
loop:
start: process-single-email
end: all-emails-processed
process-single-email:
type: agent
name: "Process Single Email"
parentId: email-processor-loop
inputs:
systemPrompt: "Classify and respond to this email"
userPrompt: "Email content: <loop.currentItem>"
model: gpt-4o
apiKey: '{{OPENAI_API_KEY}}'Boucle complexe avec plusieurs blocs enfants
data-analysis-loop:
type: loop
name: "Data Analysis Loop"
inputs:
loopType: forEach
collection: <data-fetcher.records>
maxConcurrency: 3
connections:
loop:
start: validate-record
end: generate-report
error: handle-loop-error
validate-record:
type: function
name: "Validate Record"
parentId: data-analysis-loop
inputs:
code: |
const record = <loop.currentItem>;
const index = <loop.index>;
// Validate the record
if (!record.id || !record.data) {
throw new Error(`Invalid record at index ${index}`);
}
return {
valid: true,
recordId: record.id,
processedAt: new Date().toISOString()
};
connections:
success: analyze-record
error: record-error
analyze-record:
type: agent
name: "Analyze Record"
parentId: data-analysis-loop
inputs:
systemPrompt: "Analyze this data record and extract insights"
userPrompt: |
Record ID: <validaterecord.recordId>
Data: <loop.currentItem.data>
Position in collection: <loop.index>
model: gpt-4o
apiKey: '{{OPENAI_API_KEY}}'
connections:
success: store-analysis
store-analysis:
type: function
name: "Store Analysis"
parentId: data-analysis-loop
inputs:
code: |
const analysis = <analyzerecord.content>;
const recordId = <validaterecord.recordId>;
// Store analysis result
return {
recordId,
analysis,
completedAt: new Date().toISOString()
};Boucle de traitement concurrent
parallel-processing-loop:
type: loop
name: "Parallel Processing Loop"
inputs:
loopType: forEach
collection: <start.tasks>
maxConcurrency: 5
connections:
loop:
start: process-task
end: aggregate-results
process-task:
type: api
name: "Process Task"
parentId: parallel-processing-loop
inputs:
url: "https://api.example.com/process"
method: POST
headers:
- key: "Authorization"
value: "Bearer {{API_TOKEN}}"
body: |
{
"taskId": "<loop.currentItem.id>",
"data": "<loop.currentItem.data>"
}
connections:
success: task-completedVariables de boucle
À l'intérieur des blocs enfants d'une boucle, ces variables spéciales sont disponibles :
# Available in all child blocks of the loop
<loop.index> # Current iteration number (0-based)
<loop.iteration> # Current iteration number (1-based)
<loop.currentItem> # Current item being processed (forEach loops)
<loop.items> # Full collection (forEach loops)
<loop.previousResult> # Previous iteration's body outputs (undefined on the first iteration)Utilisez <loop.previousResult> pour enchaîner les résultats d'une itération à l'autre : les blocs à l'intérieur de la boucle sont réinitialisés à chaque itération, ils ne peuvent donc pas lire directement leur propre sortie précédente. <loop.results> (ci-dessous) n'est renseigné qu'une fois la boucle terminée et doit être référencé depuis des blocs placés après la boucle.
Références aux sorties
Après la fin d'une boucle, vous pouvez référencer ses résultats agrégés :
# Dans les blocs suivant la boucle
final-processor:
inputs:
all-results: <loop-name.results> # Tableau de tous les résultats d'itération
total-count: <loop-name.count> # Nombre d'itérations terminéesBonnes pratiques
- Définissez des limites d'itération raisonnables pour éviter des temps d'exécution trop longs
- Utilisez forEach pour le traitement de collections, les boucles for pour les itérations fixes
- Pensez à utiliser maxConcurrency pour les opérations liées aux entrées/sorties
- Incluez la gestion des erreurs pour une exécution robuste de la boucle
- Donnez des noms explicites aux blocs enfants de la boucle
- Testez d'abord avec de petites collections
- Surveillez le temps d'exécution pour les grandes collections