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 :
# Disponibles dans tous les blocs enfants de la boucle
<loop.index> # Numéro d'itération courant (base 0)
<loop.currentItem> # Élément courant en cours de traitement (boucles forEach)
<loop.items> # Collection complète (boucles forEach)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