← 노드 한 장 전체#57 · Call n8n Workflow Tool
Call n8n Workflow Tool
할인 계산은 서브에 맡기고 AI는 결과 받기
이 글은 이런 분께AI Agent의 요청을 본인 계산 서브 워크플로우로 넘기고 실제 호출·입력·결과까지 검증하고 싶은 분

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요
할인 계산은 서브에 맡기고, AI는 결과 받기.
노드 한 장 #57 · Call n8n Workflow Tool
먼저 결과부터
Agent가 Call n8n Workflow Tool로 샘플 숫자 50000·10·3을 실제 서브에 전달했어요. child Code가 135000원을 계산했고 Tool 반환값과 AI 최종 답도 같았어요. parent #74870·child #74871의 입력·출력·양방향 실행 링크를 대조했어요. 최초 미게시 child 호출 #74867은 실패했고 child 실행 0개였음을 숨기지 않았어요. 이 새 계산 child만 잠깐 활성화해 검증한 뒤 부모·child 모두 inactive로 복구했어요. 재현하려면 두 JSON을 가져와 본인 서브 ID를 연결해야 해요.
우리가 실제로 돌린 기록 · 실행 #74870·#74871 · 2026-10-30
우리가 실제로 돌린 기록 · 실행 #74870·#74871 · 2026-10-30
- unitPrice: 50000
- discountPercent: 10
- quantity: 3

따라 하기
실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. n8n 캔버스에서 +를 눌러 노드를 순서대로 추가하고 같은 값을 넣으면 돼요. 빨간 제목이 이번 편의 주인공 노드예요. 표 왼쪽은 n8n 편집기에 보이는 칸 이름, 오른쪽은 다운로드 JSON의 설정값이에요. 직접 입력하기 번거로우면 JSON을 받아 ⋯ → Import from File로 가져오세요.
워크플로우 1 · [노드 한 장] Call n8n Workflow Tool · 호출하는 AI
Step 1. Manual Trigger 노드 추가이름: Run manually
설정 없이 그대로 추가해요.
Step 2. Code 노드 추가이름: Self-written sample order
| JavaScript | return [{json:{sample:true,question:'샘플 상품 단가 50000원, 할인율 10퍼센트, 수량 3개입니다. 계산 도구를 호출해서 할인 후 총액을 알려 주세요.'}}]; |
Step 3. AI Agent 노드 추가이름: AI Agent calls calculation tool
| Source for Prompt (User Message) | Define below |
| Prompt (User Message) | {{ $json.question }} |
| Options › System Message | 당신은 샘플 주문 계산을 요청하는 실습 도우미입니다. 반드시 CalculateDiscountTool을 실제 한 번 호출해 입력 숫자를 전달하고, 도구가 반환한 total을 그대로 사용해 한국어로 답하세요. 직접 암산하거나 도구 결과 없이 수치를 추측하지 마세요. 도구 결과가 없거나 오류면 계산을 완료하지 못했다고 말하세요. 최종 답에는 샘플이며 서브 워크플로우 계산 결과라고 명시하세요. |
| Options › Max Iterations | 3 |
| Options › Return Intermediate Steps | 켜짐 |
Step 4. Call n8n Workflow Tool 노드 추가이름: Call n8n Workflow Tool
| Name | CalculateDiscountTool |
| Description | Call the owned sample sub-workflow to calculate the discounted order total. Pass the user-provided unitPrice, discountPercent and quantity as numbers. The child Code performs the arithmetic. |
| Source | Database |
| Workflow | YOUR_SUB_WORKFLOW_ID |
| Workflow Inputs › Mapping Column Mode | Map Each Column Manually |
| Workflow Inputs › unitPrice | {{ $fromAI('unitPrice', '상품 단가 숫자', 'number') }} |
| Workflow Inputs › discountPercent | {{ $fromAI('discountPercent', '할인율 퍼센트 숫자', 'number') }} |
| Workflow Inputs › quantity | {{ $fromAI('quantity', '상품 수량 정수', 'number') }} |
Step 5. OpenAI Chat Model 노드 추가이름: OpenAI Chat Model
| Model | gpt-4.1-mini |
| Use Responses API | 꺼짐 |
| Options › Sampling Temperature | 0 |
| Options › Maximum Number of Tokens | 250 |
워크플로우 2 · [노드 한 장] Workflow Tool 계산하는 서브 · 샘플 할인합계
Step 6. When Executed by Another Workflow 노드 추가이름: When called by another workflow
| Input data mode | Define using fields below |
| Values 1 › Name | unitPrice |
| Values 1 › Type | Number |
| Values 2 › Name | discountPercent |
| Values 2 › Type | Number |
| Values 3 › Name | quantity |
| Values 3 › Type | Number |
Step 7. Code 노드 추가이름: Calculate sample total in Code
| JavaScript | const x=$input.first().json; const unitPrice=Number(x.unitPrice), discountPercent=Number(x.discountPercent), quantity=Number(x.quantity); if(![unitPrice,discountPercent,quantity].every(Number.isFinite)||unitPrice<0||discountPercent<0||discountPercent>100||!Number.isInteger(quantity)||quantity<1)throw new Error('Invalid sample input'); const netUnitPrice=unitPrice*(1-discountPercent/100); return [{json:{sample:true,unitPrice,discountPercent,quantity,netUnitPrice,total:netUnitPrice*quantity,currency:'KRW',calculatedBy:'child Code'}}]; |
가져와서 쓸 때 확인할 것
- 두 JSON을 별도 워크플로우로 가져온 뒤 부모 Tool의 YOUR_SUB_WORKFLOW_ID를 본인 서브 ID로 연결해야 한다.
- child Execute Workflow Trigger의 Number 입력 3개를 정의하고 Tool Workflow Inputs를 Refresh해 연결한다.
- 실제 Tool 입력과 child Trigger 입력은 50000·10·3으로 같았고 child Code가 135000을 계산했다. Tool 반환과 AI 최종 답도 그 값과 일치했다.
- 최초 #74867은 Tool 오류 2회·child 실행 0회였다. 부모 실행 자체가 success여도 Tool 성공을 뜻하지 않는다.
- 이 인스턴스의 toolWorkflow2.1 Database 호출은 미게시·비활성 child를 거절했다. 공식 문서는 Database 운영 호출에 게시된 서브를 요구하며 모든 버전·모든 수동 테스트나 이전 Execute Workflow 노드로 일반화하지 않는다.
- 새 Trigger+Code 전용 child만 잠깐 활성화해 성공 검증했고 즉시 deactivate했다. 마지막 GET에서 부모와 child 모두 active:false·activeVersionId:null이었다.
- 공개 부모 JSON은 모델 credential을 제거하고 자식 ID를 YOUR_SUB_WORKFLOW_ID로 치환했다. 공개 child에는 직접 쓴 샘플 스키마와 Code만 있다.
- 이 계산은 샘플 숫자 한 조합 검증이며 소수점 반올림·세금·복합 할인이나 중복 호출 방지 기능을 검증하지 않았다.
- YOUR_… 표시를 내 값으로 바꾸고, 계정이 필요한 서비스 노드만 자격 증명을 연결하세요. 그런 칸이나 노드가 없는 예제는 추가 계정 없이 실행할 수 있어요.
노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.