액션 노드
결정론적 워크플로 작업을 위한 비-LLM 프로그래밍 방식 노드입니다. 액션 노드는 데이터 변환, API 통합, 제어 흐름 및 자동화 로직을 처리하여 LLM 에이전트를 보완합니다.
개요
액션 노드는 LLM 에이전트 노드와 시각적으로 다릅니다 — 고유한 색상과 아이콘을 사용하여 워크플로를 쉽게 스캔할 수 있도록 합니다. 각 노드 유형은 HTTP 요청부터 데이터베이스 쿼리, 조건부 분기에 이르기까지 특정 작업 범주를 처리합니다.
모든 액션 노드는 오류 처리, 추적, 실행 제어 및 I/O 매핑을 위한 표준 속성 세트를 공유합니다. 이들은 문자열 필드에서 {{variable}} 보간을 지원하며 선행 노드 출력을 자동으로 수신합니다.

사용 가능한 노드
| 노드 | 아이콘 | 색상 | 설명 |
|---|---|---|---|
| 트리거 | 🎯 | Indigo | 워크플로우 진입점 (수동, 웹훅, 예약, 이벤트) |
| HTTP | 🌐 | 파란색 | 외부 APIs에 HTTP 요청을 보냅니다 |
| Set | 📝 | Purple | 워크플로 상태 변수를 정의하고 조작합니다 |
| 변환 | ⚙️ | Pink | 표현식 또는 내장 작업을 사용하여 데이터 변환 |
| Switch | 🔀 | Amber | 조건에 따른 조건부 분기 |
| Loop | 🔄 | Emerald | 배열을 반복하거나 작업을 반복합니다. |
| 병합 | 🔗 | Cyan | 여러 브랜치를 단일 흐름으로 다시 병합합니다. |
| 대기 | ⏱️ | 회색 | 워크플로우를 기간 또는 조건에 따라 일시 중지 |
| Code | 💻 | Red | 사용자 지정 JavaScript를 샌드박스 런타임에서 실행 |
| 데이터베이스 | 🗄️ | Teal | 데이터베이스 작업 (PostgreSQL, MySQL, SQLite, MongoDB, Redis) |
| 이메일 | 📧 | Rose | SMTP을 통해 이메일을 보내거나 IMAP을 통해 모니터링 |
| 알림 | 🔔 | 주황색 | Slack, Discord, Teams 또는 webhooks으로 전송 |
| RSS | 📡 | Lime | 새 항목에 대한 RSS/Atom feeds 모니터링 |
| 파일 | 📁 | Sky | 로컬 또는 클라우드 스토리지(S3, GCS, Azure)에서의 파일 작업 |
표준 속성
모든 액션 노드는 이러한 공유 속성들을 상속합니다:
식별자
| 속성 | 타입 | 설명 |
|---|---|---|
id | string | 고유한 식별자 |
name | 문자열 | 표시 이름 |
description | string? | 선택적 툴팁 설명 |
오류 처리
| 모드 | 동작 |
|---|---|
stop | 오류 발생 시 워크플로우 중단 (기본값) |
continue | 오류를 기록하고 다음 노드로 진행 |
retry | 구성 가능한 횟수(1-10) 및 지연(ms)으로 재시도 |
fallback | 오류 발생 시 대체 값 사용 |
추적
| 속성 | 타입 | 설명 |
|---|---|---|
enabled | boolean | 자세한 실행 추적 활성화 |
logLevel | none | error | info | debug | 로그 상세도 |
실행 제어
| 속성 | 타입 | 설명 |
|---|---|---|
timeout | number | ms 단위 시간 초과 (기본값: 30000) |
condition | string? | 표현식이 false로 평가되면 노드를 건너뜁니다. |
입력/출력 매핑
| 속성 | 타입 | 설명 |
|---|---|---|
inputMapping | Record<string, string>? | 상태 필드를 노드 입력에 매핑 |
outputKey | string | 결과가 저장되는 Key |
노드 참조
트리거 노드 🎯
워크플로우 진입점. 모든 워크플로우는 트리거 노드로 시작합니다. 자세한 내용은 전용 트리거 가이드를 참조하십시오.
| 트리거 유형 | 설명 |
|---|---|
| 수동 | 채팅 입력을 통해 사용자 시작 |
| Webhook | HTTP endpoint (POST/GET) 선택적 인증 포함 |
| 스케줄 | 시간대 지원을 포함한 Cron 기반 타이밍 |
| 이벤트 | JSONPath 필터링을 사용한 외부 시스템 이벤트 |
HTTP Node 🌐
완전한 인증, 헤더, 본문 및 응답 처리를 통해 외부 APIs에 HTTP 요청을 수행합니다.
구성:
| 속성 | 타입 | 설명 |
|---|---|---|
method | GET, POST, PUT, PATCH, DELETE | HTTP 메서드 |
url | 문자열 | URL 와 함께 {{variable}} 보간 |
auth | object | 인증 (없음, bearer, basic, api_key) |
headers | Record<string, string> | 요청 헤더 |
body | object | 본문 (none, json, form, raw) |
response | object | 응답 처리 (json, text, binary) 및 선택적 JSONPath 추출 |
rateLimit | 객체? | 속도 제한 (창당 요청 수) |
예시:
{
"type": "http",
"name": "Fetch User Data",
"method": "GET",
"url": "https://api.example.com/users/{{userId}}",
"auth": {
"type": "bearer",
"bearer": { "token": "{{API_TOKEN}}" }
},
"headers": { "Accept": "application/json" },
"body": { "type": "none" },
"response": { "type": "json", "jsonPath": "$.data" },
"errorHandling": { "mode": "retry", "retryCount": 3, "retryDelay": 1000 },
"mapping": { "outputKey": "userData" }
}
Set 노드 📝
워크플로우 상태 변수를 정의하고 조작합니다. 리터럴 값, 표현식 및 시크릿을 지원합니다.
구성:
| 속성 | 타입 | 설명 |
|---|---|---|
mode | set, merge, delete | 변수 작업 |
variables | Variable[] | 설정할 변수 목록 |
envVars | object? | .env 파일에서 선택적 접두사 필터와 함께 로드 |
변수 유형: string, number, boolean, json, expression
isSecret: true로 표시된 변수는 로그 및 UI에서 마스킹됩니다.
변환 노드 ⚙️
표현식 또는 내장 작업을 사용하여 데이터를 변환합니다.
변환 유형:
| 유형 | 설명 |
|---|---|
jsonpath | JSONPath 표현식 |
jmespath | JMESPath 표현식 |
template | 보간이 있는 문자열 템플릿 |
javascript | JavaScript 표현식 |
내장 작업: pick, omit, rename, flatten, sort, unique
타입 강제 변환 대상: string, number, boolean, array, object
스위치 노드 🔀
여러 출력 포트를 가진 조건부 분기. 각 조건은 노드의 별도 출력 포트에 매핑됩니다.

구성:
| 속성 | 타입 | 설명 |
|---|---|---|
evaluationMode | first_match | all_match | 첫 번째 일치에서 중지하거나 모두 평가 |
conditions | SwitchCondition[] | 출력 포트가 있는 조건 목록 |
defaultBranch | string? | 조건이 일치하지 않을 때의 Output port |
조건 연산자: eq, neq, gt, lt, gte, lte, contains, startsWith, endsWith, matches, in, empty, exists
예시:
{
"type": "switch",
"evaluationMode": "first_match",
"conditions": [
{ "id": "ok", "name": "Success", "field": "status", "operator": "eq", "value": "success", "outputPort": "success" },
{ "id": "err", "name": "Error", "field": "status", "operator": "eq", "value": "error", "outputPort": "error" }
],
"defaultBranch": "unknown"
}
루프 노드 🔄
배열을 반복하거나, 정해진 횟수만큼 반복하거나, 조건이 유지되는 동안 루프를 실행합니다.
루프 유형:
| 유형 | 설명 |
|---|---|
forEach | 상태에서 배열 순회 |
while | 조건이 참인 동안 반복 |
times | N번 반복 |
병렬 실행: parallel.enabled을(를) 선택적 batchSize 및 delayBetween과(와) 함께 활성화하여 동시 반복을 수행합니다.
결과 집계: results.collect이(가) true일 때, 반복 결과는 results.aggregationKey 아래의 배열로 수집됩니다.
병합 노드 🔗
여러 병렬 브랜치를 단일 흐름으로 다시 결합합니다. 여러 입력 포트를 가집니다.
병합 모드:
| 모드 | 동작 |
|---|---|
wait_all | 모든 수신 브랜치를 기다립니다 |
wait_any | 첫 번째 브랜치가 완료되면 계속 |
wait_n | N개의 브랜치 완료 후 계속 진행 |
전략 결합: array, object, first, last
선택적 타임아웃과 continue 또는 error 동작.
대기 노드 ⏱️
워크플로 실행을 일시 중지합니다.
대기 유형:
| 유형 | 설명 |
|---|---|
fixed | 고정된 기간 동안 대기 (ms, s, m, h) |
until | 특정 타임스탬프까지 기다립니다 |
webhook | 수신 웹훅을 기다립니다 |
condition | 조건을 일정 간격으로 폴링 |
코드 노드 💻
샌드박스화된 boa_engine 런타임에서 사용자 정의 JavaScript을(를) 실행합니다. 그래프 상태는 전역 input 객체로 주입됩니다.
구성:
| 속성 | 타입 | 설명 |
|---|---|---|
language | javascript, typescript | 코드 언어 |
code | string | 실행할 코드 |
sandbox | 객체 | 보안 제한 (network, filesystem, memory, time) |
샌드박스 기본값:
| 제한 | 기본값 |
|---|---|
| 네트워크 액세스 | false |
| 파일 시스템 접근 | 거짓 |
| 메모리 제한 | 128 MB |
| 시간 제한 | 5000 밀리초 |
데이터베이스 노드 🗄️
연결 풀링 및 매개변수화된 쿼리를 사용하여 데이터베이스 작업을 수행합니다.
지원되는 데이터베이스:
| 데이터베이스 | 드라이버 | 기능 |
|---|---|---|
| PostgreSQL | sqlx (postgres) | 비동기 풀, 매개변수화된 쿼리, 행-대-JSON |
| MySQL | sqlx (mysql) | 비동기 풀, 매개변수화된 쿼리, 행-to-JSON |
| SQLite | sqlx (sqlite) | Async pool, parameterized queries, row-to-JSON |
| MongoDB | mongodb | 네이티브 BSON, 찾기/삽입/업데이트/삭제 |
| Redis | redis | GET, SET, DEL, HGET, HSET, LPUSH, LRANGE |
연결 문자열은 비밀로 취급되며 로그에서 마스킹됩니다.
이메일 노드 📧
SMTP를 통해 이메일을 보내거나 IMAP을 통해 수신 이메일을 모니터링합니다.
전송 모드 (SMTP):
- TLS/SSL 지원
- 인증
- To/CC/BCC 수신자
- HTML 또는 일반 텍스트 본문
- 제목 및 본문에서
{{variable}}보간 - 상태에서 파일 첨부
모니터링 모드 (IMAP):
- 폴더 선택 (기본값: INBOX)
- 필터: 보낸 사람, 제목, 날짜 범위, 읽지 않음만
- 처리 후 읽음으로 표시
알림 노드 🔔
메시징 플랫폼으로 알림을 보냅니다.
채널: Slack, Discord, Microsoft Teams, custom webhook
메시지 형식: 일반 텍스트, 마크다운, 플랫폼별 블록 (Block Kit, Embeds, Adaptive Cards)
RSS 노드 📡
새 항목에 대해 RSS/Atom 피드를 모니터링합니다.
- 구성 가능한 폴링 간격
- 키워드, 작성자, 카테고리 및 날짜 필터
- 중복 방지를 위한 확인된 항목 추적
- 선택적 전체 콘텐츠 또는 요약만
파일 노드 📁
로컬 또는 클라우드 스토리지의 파일 작업.
작업: read, write, delete, list
클라우드 공급자: Amazon S3, Google Cloud Storage, Azure Blob Storage
파일 형식: JSON, CSV, XML, text, binary (구분 기호, 헤더, 따옴표 처리를 위한 CSV 파싱 옵션 포함)
변수 보간
액션 노드의 모든 문자열 필드는 동적 값을 위해 {{variable}} 구문을 지원합니다:
https://api.example.com/users/{{userId}}
Bearer {{API_TOKEN}}
Hello {{user.name}}, your order {{orderId}} is ready.
변수는 실행 시 워크플로 상태에서 해결됩니다. 점 표기법(user.name)은 중첩된 값에 접근합니다.
다중 포트 노드
두 가지 노드 유형은 동적 포트 수를 가집니다:
- Switch — 조건당 하나의 출력 포트와 선택적 기본 포트
- Merge — 여러 입력 포트, 들어오는 브랜치당 하나
이 포트들은 노드에 시각적으로 표현되며, 다른 다운스트림/업스트림 노드에 연결됩니다.
코드 생성
액션 노드는 LLM agents와 함께 프로덕션 Rust 코드로 컴파일됩니다. 종속성은 자동 감지되어 생성된 Cargo.toml에 추가됩니다.
| 노드 | 크레이트 | 생성하는 것 |
|---|---|---|
| HTTP | reqwest | Async HTTP 요청 (인증, 헤더, 본문, JSONPath 추출 포함) |
| 데이터베이스 | sqlx / mongodb / redis | 연결 풀, 매개변수화된 쿼리, Redis 명령어 |
| 이메일 | lettre / imap | SMTP를 TLS으로 전송; 검색 필터를 사용한 IMAP 모니터링 |
| 코드 | boa_engine | 임베디드 JavaScript 실행 (graph state)를 input 객체로 |
| 설정 | native | 변수 할당 (리터럴, 표현식, 시크릿) |
| 변환 | 네이티브 | Map, filter, sort, reduce, flatten, group, pick, merge, template |
| 병합 | native | 브랜치 조합 (waitAll, waitAny, append) |
모든 생성된 코드는 오류 처리를 위해 adk-graph FunctionNode 클로저와 함께 GraphError::NodeExecutionFailed를 사용합니다.
생성된 코드 예시 (HTTP 노드):
let http_node = FunctionNode::new("fetch_data", |ctx| async move {
let client = reqwest::Client::new();
let resp = client.get("https://api.example.com/data")
.bearer_auth(&ctx.get("API_TOKEN").unwrap_or_default())
.send().await
.map_err(|e| GraphError::NodeExecutionFailed {
node: "fetch_data".into(),
message: e.to_string(),
})?;
let body: serde_json::Value = resp.json().await?;
Ok(NodeOutput::new().with_update("apiData", body))
});
생성된 코드 예시 (코드 노드):
let code_node = FunctionNode::new("process", |ctx| async move {
let mut js_ctx = boa_engine::Context::default();
// Graph state injected as global `input` object
// User code executed in thread-isolated sandbox
Ok(NodeOutput::new().with_update("result", output))
});
이전: ← Studio | 다음: Triggers →