액션 노드

결정론적 워크플로 작업을 위한 비-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)
이메일📧RoseSMTP을 통해 이메일을 보내거나 IMAP을 통해 모니터링
알림🔔주황색Slack, Discord, Teams 또는 webhooks으로 전송
RSS📡Lime새 항목에 대한 RSS/Atom feeds 모니터링
파일📁Sky로컬 또는 클라우드 스토리지(S3, GCS, Azure)에서의 파일 작업

표준 속성

모든 액션 노드는 이러한 공유 속성들을 상속합니다:

식별자

속성타입설명
idstring고유한 식별자
name문자열표시 이름
descriptionstring?선택적 툴팁 설명

오류 처리

모드동작
stop오류 발생 시 워크플로우 중단 (기본값)
continue오류를 기록하고 다음 노드로 진행
retry구성 가능한 횟수(1-10) 및 지연(ms)으로 재시도
fallback오류 발생 시 대체 값 사용

추적

속성타입설명
enabledboolean자세한 실행 추적 활성화
logLevelnone | error | info | debug로그 상세도

실행 제어

속성타입설명
timeoutnumberms 단위 시간 초과 (기본값: 30000)
conditionstring?표현식이 false로 평가되면 노드를 건너뜁니다.

입력/출력 매핑

속성타입설명
inputMappingRecord<string, string>?상태 필드를 노드 입력에 매핑
outputKeystring결과가 저장되는 Key

노드 참조

트리거 노드 🎯

워크플로우 진입점. 모든 워크플로우는 트리거 노드로 시작합니다. 자세한 내용은 전용 트리거 가이드를 참조하십시오.

트리거 유형설명
수동채팅 입력을 통해 사용자 시작
WebhookHTTP endpoint (POST/GET) 선택적 인증 포함
스케줄시간대 지원을 포함한 Cron 기반 타이밍
이벤트JSONPath 필터링을 사용한 외부 시스템 이벤트

HTTP Node 🌐

완전한 인증, 헤더, 본문 및 응답 처리를 통해 외부 APIs에 HTTP 요청을 수행합니다.

구성:

속성타입설명
methodGET, POST, PUT, PATCH, DELETEHTTP 메서드
url문자열URL 와 함께 {{variable}} 보간
authobject인증 (없음, bearer, basic, api_key)
headersRecord<string, string>요청 헤더
bodyobject본문 (none, json, form, raw)
responseobject응답 처리 (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 노드 📝

워크플로우 상태 변수를 정의하고 조작합니다. 리터럴 값, 표현식 및 시크릿을 지원합니다.

구성:

속성타입설명
modeset, merge, delete변수 작업
variablesVariable[]설정할 변수 목록
envVarsobject?.env 파일에서 선택적 접두사 필터와 함께 로드

변수 유형: string, number, boolean, json, expression

isSecret: true로 표시된 변수는 로그 및 UI에서 마스킹됩니다.

변환 노드 ⚙️

표현식 또는 내장 작업을 사용하여 데이터를 변환합니다.

변환 유형:

유형설명
jsonpathJSONPath 표현식
jmespathJMESPath 표현식
template보간이 있는 문자열 템플릿
javascriptJavaScript 표현식

내장 작업: pick, omit, rename, flatten, sort, unique

타입 강제 변환 대상: string, number, boolean, array, object

스위치 노드 🔀

여러 출력 포트를 가진 조건부 분기. 각 조건은 노드의 별도 출력 포트에 매핑됩니다.

스위치 속성 패널

구성:

속성타입설명
evaluationModefirst_match | all_match첫 번째 일치에서 중지하거나 모두 평가
conditionsSwitchCondition[]출력 포트가 있는 조건 목록
defaultBranchstring?조건이 일치하지 않을 때의 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조건이 참인 동안 반복
timesN번 반복

병렬 실행: parallel.enabled을(를) 선택적 batchSizedelayBetween과(와) 함께 활성화하여 동시 반복을 수행합니다.

결과 집계: results.collect이(가) true일 때, 반복 결과는 results.aggregationKey 아래의 배열로 수집됩니다.

병합 노드 🔗

여러 병렬 브랜치를 단일 흐름으로 다시 결합합니다. 여러 입력 포트를 가집니다.

병합 모드:

모드동작
wait_all모든 수신 브랜치를 기다립니다
wait_any첫 번째 브랜치가 완료되면 계속
wait_nN개의 브랜치 완료 후 계속 진행

전략 결합: array, object, first, last

선택적 타임아웃과 continue 또는 error 동작.

대기 노드 ⏱️

워크플로 실행을 일시 중지합니다.

대기 유형:

유형설명
fixed고정된 기간 동안 대기 (ms, s, m, h)
until특정 타임스탬프까지 기다립니다
webhook수신 웹훅을 기다립니다
condition조건을 일정 간격으로 폴링

코드 노드 💻

샌드박스화된 boa_engine 런타임에서 사용자 정의 JavaScript을(를) 실행합니다. 그래프 상태는 전역 input 객체로 주입됩니다.

구성:

속성타입설명
languagejavascript, typescript코드 언어
codestring실행할 코드
sandbox객체보안 제한 (network, filesystem, memory, time)

샌드박스 기본값:

제한기본값
네트워크 액세스false
파일 시스템 접근거짓
메모리 제한128 MB
시간 제한5000 밀리초

데이터베이스 노드 🗄️

연결 풀링 및 매개변수화된 쿼리를 사용하여 데이터베이스 작업을 수행합니다.

지원되는 데이터베이스:

데이터베이스드라이버기능
PostgreSQLsqlx (postgres)비동기 풀, 매개변수화된 쿼리, 행-대-JSON
MySQLsqlx (mysql)비동기 풀, 매개변수화된 쿼리, 행-to-JSON
SQLitesqlx (sqlite)Async pool, parameterized queries, row-to-JSON
MongoDBmongodb네이티브 BSON, 찾기/삽입/업데이트/삭제
RedisredisGET, 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에 추가됩니다.

노드크레이트생성하는 것
HTTPreqwestAsync HTTP 요청 (인증, 헤더, 본문, JSONPath 추출 포함)
데이터베이스sqlx / mongodb / redis연결 풀, 매개변수화된 쿼리, Redis 명령어
이메일lettre / imapSMTP를 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 →