72일차 정답 추가 (실습 정답본 · answers · VIBE-A · tbench)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mcchaeandClaude Opus 5.5 committed 2026-10-26 20:15:51 +09:00
1 parent baf72561f7
commit d88c5122d5
105 files changed
+24165

No files matched your search

+47
View File
@@ -0,0 +1,47 @@
$ uv run tools/flow.py call base-helpdesk requests/faq-vpn.json -v
HTTP 200 · 4.4s
→ request POST /webhook/base-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
]
}
$ uv run tools/flow.py bench base-helpdesk requests/faq-vpn.json -n 5
POST http://localhost:5678/webhook/base-helpdesk × 5
✔ #1 · HTTP 200 · 2.98s · route=자동 답변
✔ #2 · HTTP 200 · 2.52s · route=자동 답변
✔ #3 · HTTP 200 · 2.69s · route=자동 답변
✔ #4 · HTTP 200 · 2.84s · route=자동 답변
✔ #5 · HTTP 200 · 2.54s · route=자동 답변
p50 2.69s · p95 2.98s · max 2.98s · failures 0/5
report: runs/bench-base-helpdesk-20261024-174234.json
$ uv run tools/flow.py bench base-helpdesk requests/ticket-own.json -n 5
POST http://localhost:5678/webhook/base-helpdesk × 5
✔ #1 · HTTP 200 · 3.04s · route=자동 답변
✔ #2 · HTTP 200 · 3.14s · route=자동 답변
✔ #3 · HTTP 200 · 2.61s · route=자동 답변
✔ #4 · HTTP 200 · 3.36s · route=자동 답변
✔ #5 · HTTP 200 · 2.68s · route=자동 답변
p50 3.04s · p95 3.36s · max 3.36s · failures 0/5
report: runs/bench-base-helpdesk-20261024-174249.json
$ uv run tools/flow.py bench base-helpdesk requests/off-topic.json -n 5
POST http://localhost:5678/webhook/base-helpdesk × 5
✔ #1 · HTTP 200 · 2.90s · route=자동 답변
✔ #2 · HTTP 200 · 2.55s · route=자동 답변
✔ #3 · HTTP 200 · 2.62s · route=자동 답변
✔ #4 · HTTP 200 · 2.56s · route=자동 답변
✔ #5 · HTTP 200 · 2.44s · route=자동 답변
p50 2.56s · p95 2.90s · max 2.90s · failures 0/5
report: runs/bench-base-helpdesk-20261024-174302.json
@@ -0,0 +1,95 @@
{
"cases": "lab01.json",
"webhook": "base-helpdesk",
"passed": 1,
"total": 4,
"results": [
{
"case": "VPN FAQ · 단계별 시간",
"webhook": "base-helpdesk",
"run": 1,
"passed": false,
"problems": [
"timings has none of ['answer_ms']"
],
"seconds": 3.5,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-003"
]
}
},
{
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
"webhook": "base-helpdesk",
"run": 1,
"passed": false,
"problems": [
"timings has none of ['total_ms']",
"steps has none of ['answer']",
"llm_calls has none of ['1', '2', '3']"
],
"seconds": 2.9,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주십시오.",
"sources": [
"FAQ-003"
]
}
},
{
"case": "접수 현황",
"webhook": "base-helpdesk",
"run": 1,
"passed": false,
"problems": [
"timings has none of ['answer_ms']"
],
"seconds": 2.8,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": []
}
},
{
"case": "빈 질문",
"webhook": "base-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
+58
View File
@@ -0,0 +1,58 @@
POST http://localhost:5678/webhook/base-helpdesk · 4 case(s) × 1
✘ VPN FAQ · 단계별 시간 · 3.5s · timings has none of ['answer_ms']
→ request POST /webhook/base-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-003"
]
}
✘ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.9s · timings has none of ['total_ms']; steps has none of ['answer']; llm_calls has none of ['1', '2', '3']
→ request POST /webhook/base-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주십시오.",
"sources": [
"FAQ-003"
]
}
✘ 접수 현황 · 2.8s · timings has none of ['answer_ms']
→ request POST /webhook/base-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": []
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/base-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 1/4
report: runs/lab01-20261024-174311.json
+137
View File
@@ -0,0 +1,137 @@
{
"cases": "lab01.json",
"webhook": "my-helpdesk",
"passed": 3,
"total": 4,
"results": [
{
"case": "VPN FAQ · 단계별 시간",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.3,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 1210,
"data_ms": 29,
"answer_ms": 1119,
"review_ms": 1042,
"total_ms": 3426
}
}
},
{
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.8,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 753,
"data_ms": 19,
"answer_ms": 1058,
"review_ms": 890,
"total_ms": 2731
}
}
},
{
"case": "접수 현황",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"answer has none of ['처리 중']"
],
"seconds": 3.3,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 929,
"data_ms": 21,
"answer_ms": 1118,
"review_ms": 1029,
"total_ms": 3108
}
}
},
{
"case": "빈 질문",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
+106
View File
@@ -0,0 +1,106 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ VPN FAQ · 단계별 시간 · 4.3s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 1210,
"data_ms": 29,
"answer_ms": 1119,
"review_ms": 1042,
"total_ms": 3426
}
}
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.8s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 753,
"data_ms": 19,
"answer_ms": 1058,
"review_ms": 890,
"total_ms": 2731
}
}
✘ 접수 현황 · 3.3s · answer has none of ['처리 중']
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 929,
"data_ms": 21,
"answer_ms": 1118,
"review_ms": 1029,
"total_ms": 3108
}
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 3/4
report: runs/lab01-20261024-174333.json
+33
View File
@@ -0,0 +1,33 @@
$ uv run tools/flow.py call my-helpdesk requests/faq-vpn.json -v
HTTP 200 · 2.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하시고, 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 616,
"data_ms": 18,
"answer_ms": 1124,
"review_ms": 920,
"total_ms": 2698
}
}
+92
View File
@@ -0,0 +1,92 @@
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn-nocache.json -n 5
POST http://localhost:5678/webhook/my-helpdesk × 5
✔ #1 · HTTP 200 · 2.57s · route=자동 답변, llm_calls=3, cached=false
✔ #2 · HTTP 200 · 3.08s · route=자동 답변, llm_calls=3, cached=false
✔ #3 · HTTP 200 · 2.91s · route=자동 답변, llm_calls=3, cached=false
✔ #4 · HTTP 200 · 2.99s · route=자동 답변, llm_calls=3, cached=false
✔ #5 · HTTP 200 · 2.80s · route=자동 답변, llm_calls=3, cached=false
p50 2.91s · p95 3.08s · max 3.08s · failures 0/5
report: runs/bench-my-helpdesk-20261024-174351.json
$ uv run tools/flow.py bench my-helpdesk requests/ticket-own.json -n 5
POST http://localhost:5678/webhook/my-helpdesk × 5
✔ #1 · HTTP 200 · 2.86s · route=자동 답변, llm_calls=3, cached=false
✔ #2 · HTTP 200 · 3.05s · route=자동 답변, llm_calls=3, cached=false
✔ #3 · HTTP 200 · 3.12s · route=자동 답변, llm_calls=3, cached=false
✔ #4 · HTTP 200 · 2.94s · route=자동 답변, llm_calls=3, cached=false
✔ #5 · HTTP 200 · 2.99s · route=자동 답변, llm_calls=3, cached=false
p50 2.99s · p95 3.12s · max 3.12s · failures 0/5
report: runs/bench-my-helpdesk-20261024-174406.json
$ uv run tools/flow.py bench my-helpdesk requests/off-topic.json -n 5
POST http://localhost:5678/webhook/my-helpdesk × 5
✔ #1 · HTTP 200 · 2.38s · route=자동 답변, llm_calls=3, cached=false
✔ #2 · HTTP 200 · 2.36s · route=자동 답변, llm_calls=3, cached=false
✔ #3 · HTTP 200 · 2.48s · route=자동 답변, llm_calls=3, cached=false
✔ #4 · HTTP 200 · 2.49s · route=자동 답변, llm_calls=3, cached=false
✔ #5 · HTTP 200 · 2.84s · route=자동 답변, llm_calls=3, cached=false
p50 2.48s · p95 2.84s · max 2.84s · failures 0/5
report: runs/bench-my-helpdesk-20261024-174419.json
$ uv run tools/flow.py call my-helpdesk requests/ticket-own.json -v
HTTP 200 · 2.8s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 818,
"data_ms": 43,
"answer_ms": 877,
"review_ms": 895,
"total_ms": 2647
}
}
$ uv run tools/flow.py call my-helpdesk requests/off-topic.json -v
HTTP 200 · 2.5s
→ request POST /webhook/my-helpdesk
{
"question": "오늘 점심 메뉴 추천해 주세요",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "other",
"answer": "찾으시는 정보를 확인하지 못했습니다. 점심 메뉴 추천은 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 732,
"data_ms": 19,
"answer_ms": 740,
"review_ms": 978,
"total_ms": 2482
}
}
@@ -0,0 +1,166 @@
{
"cases": "lab01-challenge.json",
"webhook": "my-helpdesk",
"passed": 0,
"total": 4,
"results": [
{
"case": "FAQ · 접수 시간 따로",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"timings has none of ['faq_ms']"
],
"seconds": 2.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 595,
"data_ms": 18,
"answer_ms": 1005,
"review_ms": 1012,
"total_ms": 2643
}
}
},
{
"case": "접수 조회 시간",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"timings has none of ['ticket_ms']"
],
"seconds": 2.6,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 716,
"data_ms": 19,
"answer_ms": 958,
"review_ms": 881,
"total_ms": 2594
}
}
},
{
"case": "가장 오래 걸린 단계",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"slowest_step has none of ['classify', 'answer', 'review']"
],
"seconds": 3.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 991,
"data_ms": 18,
"answer_ms": 1024,
"review_ms": 991,
"total_ms": 3037
}
}
},
{
"case": "접수 현황도 같은 모양",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"answer has none of ['처리 중']",
"slowest_step has none of ['classify', 'answer', 'review']"
],
"seconds": 2.8,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 803,
"data_ms": 36,
"answer_ms": 884,
"review_ms": 1043,
"total_ms": 2781
}
}
}
]
}
@@ -0,0 +1,128 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✘ FAQ · 접수 시간 따로 · 2.7s · timings has none of ['faq_ms']
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 595,
"data_ms": 18,
"answer_ms": 1005,
"review_ms": 1012,
"total_ms": 2643
}
}
✘ 접수 조회 시간 · 2.6s · timings has none of ['ticket_ms']
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 716,
"data_ms": 19,
"answer_ms": 958,
"review_ms": 881,
"total_ms": 2594
}
}
✘ 가장 오래 걸린 단계 · 3.1s · slowest_step has none of ['classify', 'answer', 'review']
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 991,
"data_ms": 18,
"answer_ms": 1024,
"review_ms": 991,
"total_ms": 3037
}
}
✘ 접수 현황도 같은 모양 · 2.8s · answer has none of ['처리 중']; slowest_step has none of ['classify', 'answer', 'review']
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 803,
"data_ms": 36,
"answer_ms": 884,
"review_ms": 1043,
"total_ms": 2781
}
}
Passed 0/4
report: runs/lab01-challenge-20261024-174435.json
+165
View File
@@ -0,0 +1,165 @@
{
"cases": "lab01-challenge.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "FAQ · 접수 시간 따로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.5,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 1365,
"faq_ms": 16,
"ticket_ms": 14,
"answer_ms": 1196,
"review_ms": 993,
"total_ms": 3614
},
"slowest_step": "classify"
}
},
{
"case": "접수 조회 시간",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 774,
"faq_ms": 17,
"ticket_ms": 13,
"answer_ms": 971,
"review_ms": 815,
"total_ms": 2601
},
"slowest_step": "answer"
}
},
{
"case": "가장 오래 걸린 단계",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.0,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주십시오.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 680,
"faq_ms": 17,
"ticket_ms": 10,
"answer_ms": 1044,
"review_ms": 1007,
"total_ms": 2769
},
"slowest_step": "answer"
}
},
{
"case": "접수 현황도 같은 모양",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 723,
"faq_ms": 13,
"ticket_ms": 11,
"answer_ms": 1029,
"review_ms": 1162,
"total_ms": 2951
},
"slowest_step": "review"
}
}
]
}
+136
View File
@@ -0,0 +1,136 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ FAQ · 접수 시간 따로 · 4.5s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 1365,
"faq_ms": 16,
"ticket_ms": 14,
"answer_ms": 1196,
"review_ms": 993,
"total_ms": 3614
},
"slowest_step": "classify"
}
✔ 접수 조회 시간 · 2.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 774,
"faq_ms": 17,
"ticket_ms": 13,
"answer_ms": 971,
"review_ms": 815,
"total_ms": 2601
},
"slowest_step": "answer"
}
✔ 가장 오래 걸린 단계 · 3.0s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주십시오.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 680,
"faq_ms": 17,
"ticket_ms": 10,
"answer_ms": 1044,
"review_ms": 1007,
"total_ms": 2769
},
"slowest_step": "answer"
}
✔ 접수 현황도 같은 모양 · 3.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 723,
"faq_ms": 13,
"ticket_ms": 11,
"answer_ms": 1029,
"review_ms": 1162,
"total_ms": 2951
},
"slowest_step": "review"
}
Passed 4/4
report: runs/lab01-challenge-20261024-174502.json
@@ -0,0 +1,141 @@
{
"cases": "lab01.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "VPN FAQ · 단계별 시간",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.9,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 844,
"faq_ms": 16,
"ticket_ms": 9,
"answer_ms": 990,
"review_ms": 927,
"total_ms": 2807
},
"slowest_step": "answer"
}
},
{
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.8,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 715,
"faq_ms": 16,
"ticket_ms": 14,
"answer_ms": 1064,
"review_ms": 988,
"total_ms": 2810
},
"slowest_step": "answer"
}
},
{
"case": "접수 현황",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 810,
"faq_ms": 16,
"ticket_ms": 11,
"answer_ms": 1014,
"review_ms": 1058,
"total_ms": 2925
},
"slowest_step": "review"
}
},
{
"case": "빈 질문",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
@@ -0,0 +1,112 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ VPN FAQ · 단계별 시간 · 2.9s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 844,
"faq_ms": 16,
"ticket_ms": 9,
"answer_ms": 990,
"review_ms": 927,
"total_ms": 2807
},
"slowest_step": "answer"
}
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.8s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 715,
"faq_ms": 16,
"ticket_ms": 14,
"answer_ms": 1064,
"review_ms": 988,
"total_ms": 2810
},
"slowest_step": "answer"
}
✔ 접수 현황 · 3.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 810,
"faq_ms": 16,
"ticket_ms": 11,
"answer_ms": 1014,
"review_ms": 1058,
"total_ms": 2925
},
"slowest_step": "review"
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 4/4
report: runs/lab01-20261024-174511.json
@@ -0,0 +1,180 @@
{
"cases": "lab01-challenge2.json",
"webhook": "my-helpdesk",
"passed": 0,
"total": 4,
"results": [
{
"case": "예산 안 (넉넉한 예산)",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"over_budget = null (expected false)",
"budget_ms = null (expected 60000)",
"llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']"
],
"seconds": 2.9,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true,
"budget_ms": 60000
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 628,
"faq_ms": 11,
"ticket_ms": 11,
"answer_ms": 1142,
"review_ms": 1028,
"total_ms": 2862
},
"slowest_step": "answer"
}
},
{
"case": "예산 넘음 (0.5초 예산)",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"over_budget = null (expected true)",
"budget_ms = null (expected 500)"
],
"seconds": 2.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true,
"budget_ms": 500
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 658,
"faq_ms": 14,
"ticket_ms": 11,
"answer_ms": 1013,
"review_ms": 930,
"total_ms": 2640
},
"slowest_step": "answer"
}
},
{
"case": "예산을 안 주면 3초",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"budget_ms = null (expected 3000)",
"llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']"
],
"seconds": 3.6,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 650,
"faq_ms": 14,
"ticket_ms": 13,
"answer_ms": 1767,
"review_ms": 1061,
"total_ms": 3520
},
"slowest_step": "answer"
}
},
{
"case": "접수 현황도 같은 모양",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"budget_ms = null (expected 3000)",
"llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']"
],
"seconds": 2.8,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 772,
"faq_ms": 14,
"ticket_ms": 12,
"answer_ms": 895,
"review_ms": 1006,
"total_ms": 2719
},
"slowest_step": "review"
}
}
]
}
@@ -0,0 +1,138 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✘ 예산 안 (넉넉한 예산) · 2.9s · over_budget = null (expected false); budget_ms = null (expected 60000); llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true,
"budget_ms": 60000
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 628,
"faq_ms": 11,
"ticket_ms": 11,
"answer_ms": 1142,
"review_ms": 1028,
"total_ms": 2862
},
"slowest_step": "answer"
}
✘ 예산 넘음 (0.5초 예산) · 2.7s · over_budget = null (expected true); budget_ms = null (expected 500)
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true,
"budget_ms": 500
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 658,
"faq_ms": 14,
"ticket_ms": 11,
"answer_ms": 1013,
"review_ms": 930,
"total_ms": 2640
},
"slowest_step": "answer"
}
✘ 예산을 안 주면 3초 · 3.6s · budget_ms = null (expected 3000); llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 650,
"faq_ms": 14,
"ticket_ms": 13,
"answer_ms": 1767,
"review_ms": 1061,
"total_ms": 3520
},
"slowest_step": "answer"
}
✘ 접수 현황도 같은 모양 · 2.8s · budget_ms = null (expected 3000); llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 772,
"faq_ms": 14,
"ticket_ms": 12,
"answer_ms": 895,
"review_ms": 1006,
"total_ms": 2719
},
"slowest_step": "review"
}
Passed 0/4
report: runs/lab01-challenge2-20261024-174523.json
@@ -0,0 +1,179 @@
{
"cases": "lab01-challenge2.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "예산 안 (넉넉한 예산)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true,
"budget_ms": 60000
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 1208,
"faq_ms": 17,
"ticket_ms": 14,
"answer_ms": 1230,
"review_ms": 857,
"total_ms": 3357
},
"slowest_step": "answer",
"llm_ms": 3295,
"budget_ms": 60000,
"over_budget": false
}
},
{
"case": "예산 넘음 (0.5초 예산)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true,
"budget_ms": 500
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 667,
"faq_ms": 15,
"ticket_ms": 11,
"answer_ms": 980,
"review_ms": 916,
"total_ms": 2609
},
"slowest_step": "answer",
"llm_ms": 2563,
"budget_ms": 500,
"over_budget": true
}
},
{
"case": "예산을 안 주면 3초",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 761,
"faq_ms": 18,
"ticket_ms": 18,
"answer_ms": 1027,
"review_ms": 1185,
"total_ms": 3023
},
"slowest_step": "review",
"llm_ms": 2973,
"budget_ms": 3000,
"over_budget": true
}
},
{
"case": "접수 현황도 같은 모양",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.9,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 795,
"faq_ms": 13,
"ticket_ms": 14,
"answer_ms": 1017,
"review_ms": 1046,
"total_ms": 2904
},
"slowest_step": "review",
"llm_ms": 2858,
"budget_ms": 3000,
"over_budget": false
}
}
]
}
+150
View File
@@ -0,0 +1,150 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 예산 안 (넉넉한 예산) · 4.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true,
"budget_ms": 60000
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 1208,
"faq_ms": 17,
"ticket_ms": 14,
"answer_ms": 1230,
"review_ms": 857,
"total_ms": 3357
},
"slowest_step": "answer",
"llm_ms": 3295,
"budget_ms": 60000,
"over_budget": false
}
✔ 예산 넘음 (0.5초 예산) · 2.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true,
"budget_ms": 500
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 667,
"faq_ms": 15,
"ticket_ms": 11,
"answer_ms": 980,
"review_ms": 916,
"total_ms": 2609
},
"slowest_step": "answer",
"llm_ms": 2563,
"budget_ms": 500,
"over_budget": true
}
✔ 예산을 안 주면 3초 · 3.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 761,
"faq_ms": 18,
"ticket_ms": 18,
"answer_ms": 1027,
"review_ms": 1185,
"total_ms": 3023
},
"slowest_step": "review",
"llm_ms": 2973,
"budget_ms": 3000,
"over_budget": true
}
✔ 접수 현황도 같은 모양 · 2.9s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 795,
"faq_ms": 13,
"ticket_ms": 14,
"answer_ms": 1017,
"review_ms": 1046,
"total_ms": 2904
},
"slowest_step": "review",
"llm_ms": 2858,
"budget_ms": 3000,
"over_budget": false
}
Passed 4/4
report: runs/lab01-challenge2-20261024-174548.json
@@ -0,0 +1,177 @@
{
"cases": "lab01-challenge.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "FAQ · 접수 시간 따로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 603,
"faq_ms": 9,
"ticket_ms": 10,
"answer_ms": 969,
"review_ms": 1043,
"total_ms": 2677
},
"slowest_step": "review",
"llm_ms": 2615,
"budget_ms": 3000,
"over_budget": false
}
},
{
"case": "접수 조회 시간",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.6,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 614,
"faq_ms": 13,
"ticket_ms": 13,
"answer_ms": 1019,
"review_ms": 876,
"total_ms": 2543
},
"slowest_step": "answer",
"llm_ms": 2509,
"budget_ms": 3000,
"over_budget": false
}
},
{
"case": "가장 오래 걸린 단계",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.9,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 687,
"faq_ms": 17,
"ticket_ms": 10,
"answer_ms": 1146,
"review_ms": 965,
"total_ms": 2838
},
"slowest_step": "answer",
"llm_ms": 2798,
"budget_ms": 3000,
"over_budget": false
}
},
{
"case": "접수 현황도 같은 모양",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.9,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 767,
"faq_ms": 15,
"ticket_ms": 9,
"answer_ms": 1053,
"review_ms": 1007,
"total_ms": 2865
},
"slowest_step": "answer",
"llm_ms": 2827,
"budget_ms": 3000,
"over_budget": false
}
}
]
}
@@ -0,0 +1,148 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ FAQ · 접수 시간 따로 · 2.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 603,
"faq_ms": 9,
"ticket_ms": 10,
"answer_ms": 969,
"review_ms": 1043,
"total_ms": 2677
},
"slowest_step": "review",
"llm_ms": 2615,
"budget_ms": 3000,
"over_budget": false
}
✔ 접수 조회 시간 · 2.6s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 614,
"faq_ms": 13,
"ticket_ms": 13,
"answer_ms": 1019,
"review_ms": 876,
"total_ms": 2543
},
"slowest_step": "answer",
"llm_ms": 2509,
"budget_ms": 3000,
"over_budget": false
}
✔ 가장 오래 걸린 단계 · 2.9s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 687,
"faq_ms": 17,
"ticket_ms": 10,
"answer_ms": 1146,
"review_ms": 965,
"total_ms": 2838
},
"slowest_step": "answer",
"llm_ms": 2798,
"budget_ms": 3000,
"over_budget": false
}
✔ 접수 현황도 같은 모양 · 2.9s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 767,
"faq_ms": 15,
"ticket_ms": 9,
"answer_ms": 1053,
"review_ms": 1007,
"total_ms": 2865
},
"slowest_step": "answer",
"llm_ms": 2827,
"budget_ms": 3000,
"over_budget": false
}
Passed 4/4
report: runs/lab01-challenge-20261024-174559.json
+150
View File
@@ -0,0 +1,150 @@
{
"cases": "lab01.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "VPN FAQ · 단계별 시간",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.0,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 785,
"faq_ms": 14,
"ticket_ms": 9,
"answer_ms": 1053,
"review_ms": 1031,
"total_ms": 2902
},
"slowest_step": "answer",
"llm_ms": 2869,
"budget_ms": 3000,
"over_budget": false
}
},
{
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 750,
"faq_ms": 15,
"ticket_ms": 14,
"answer_ms": 984,
"review_ms": 895,
"total_ms": 2672
},
"slowest_step": "answer",
"llm_ms": 2629,
"budget_ms": 3000,
"over_budget": false
}
},
{
"case": "접수 현황",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.4,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 938,
"faq_ms": 10,
"ticket_ms": 9,
"answer_ms": 981,
"review_ms": 1355,
"total_ms": 3310
},
"slowest_step": "review",
"llm_ms": 3274,
"budget_ms": 3000,
"over_budget": true
}
},
{
"case": "빈 질문",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
+121
View File
@@ -0,0 +1,121 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ VPN FAQ · 단계별 시간 · 3.0s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 785,
"faq_ms": 14,
"ticket_ms": 9,
"answer_ms": 1053,
"review_ms": 1031,
"total_ms": 2902
},
"slowest_step": "answer",
"llm_ms": 2869,
"budget_ms": 3000,
"over_budget": false
}
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 750,
"faq_ms": 15,
"ticket_ms": 14,
"answer_ms": 984,
"review_ms": 895,
"total_ms": 2672
},
"slowest_step": "answer",
"llm_ms": 2629,
"budget_ms": 3000,
"over_budget": false
}
✔ 접수 현황 · 3.4s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"classify_ms": 938,
"faq_ms": 10,
"ticket_ms": 9,
"answer_ms": 981,
"review_ms": 1355,
"total_ms": 3310
},
"slowest_step": "review",
"llm_ms": 3274,
"budget_ms": 3000,
"over_budget": true
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 4/4
report: runs/lab01-20261024-174609.json
+332
View File
@@ -0,0 +1,332 @@
{
"cases": "lab02.json",
"webhook": "my-helpdesk",
"passed": 7,
"total": 9,
"results": [
{
"case": "예제 1 · 프린터 FAQ는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.8,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-004"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 41,
"answer_ms": 1766,
"review_ms": 1115,
"total_ms": 2945
}
}
},
{
"case": "예제 1 · 접수 번호는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.5,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 32,
"answer_ms": 1041,
"review_ms": 1209,
"total_ms": 2295
}
}
},
{
"case": "예제 1 · 없는 접수 번호",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.1,
"status": 200,
"request": {
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 현재 확인되지 않습니다. 담당 직원이 확인 후 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 23,
"answer_ms": 1209,
"review_ms": 797,
"total_ms": 2040
}
}
},
{
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.4,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 21,
"classify_ms": 582,
"answer_ms": 908,
"review_ms": 877,
"total_ms": 2401
}
}
},
{
"case": "예제 2 · 처음 묻는 VPN",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.3,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 20,
"answer_ms": 1202,
"review_ms": 994,
"total_ms": 2234
}
}
},
{
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"took 1.9s (expected at most 1s)",
"cached = false (expected true)",
"llm_calls = 2 (expected 0)"
],
"seconds": 1.9,
"status": 200,
"request": {
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 문제가 계속되면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 24,
"answer_ms": 967,
"review_ms": 890,
"total_ms": 1898
}
}
},
{
"case": "예제 2 · no_cache면 캐시 안 씀",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.3,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 17,
"answer_ms": 1128,
"review_ms": 1048,
"total_ms": 2213
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.2,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 30,
"answer_ms": 829,
"review_ms": 1300,
"total_ms": 2171
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"answer has none of ['처리 중']"
],
"seconds": 2.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 20,
"answer_ms": 951,
"review_ms": 940,
"total_ms": 1924
}
}
}
]
}
+268
View File
@@ -0,0 +1,268 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 2}
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 3.8s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-004"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 41,
"answer_ms": 1766,
"review_ms": 1115,
"total_ms": 2945
}
}
✔ 예제 1 · 접수 번호는 규칙으로 · 2.5s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 32,
"answer_ms": 1041,
"review_ms": 1209,
"total_ms": 2295
}
}
✔ 예제 1 · 없는 접수 번호 · 2.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 현재 확인되지 않습니다. 담당 직원이 확인 후 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 23,
"answer_ms": 1209,
"review_ms": 797,
"total_ms": 2040
}
}
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 2.4s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 21,
"classify_ms": 582,
"answer_ms": 908,
"review_ms": 877,
"total_ms": 2401
}
}
✔ 예제 2 · 처음 묻는 VPN · 2.3s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 20,
"answer_ms": 1202,
"review_ms": 994,
"total_ms": 2234
}
}
✘ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 1.9s · took 1.9s (expected at most 1s); cached = false (expected true); llm_calls = 2 (expected 0)
→ request POST /webhook/my-helpdesk
{
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 문제가 계속되면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 24,
"answer_ms": 967,
"review_ms": 890,
"total_ms": 1898
}
}
✔ 예제 2 · no_cache면 캐시 안 씀 · 2.3s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 17,
"answer_ms": 1128,
"review_ms": 1048,
"total_ms": 2213
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 2.2s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 30,
"answer_ms": 829,
"review_ms": 1300,
"total_ms": 2171
}
}
✘ 예제 2 · 접수 현황은 캐시 안 함 (2) · 2.0s · answer has none of ['처리 중']
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 20,
"answer_ms": 951,
"review_ms": 940,
"total_ms": 1924
}
}
Passed 7/9
report: runs/lab02-20261024-174642.json
@@ -0,0 +1,10 @@
$ uv run tools/flow.py bench my-helpdesk requests/faq-printer.json -n 5
POST http://localhost:5678/webhook/my-helpdesk × 5
✔ #1 · HTTP 200 · 2.50s · route=자동 답변, llm_calls=2, cached=false
✔ #2 · HTTP 200 · 2.45s · route=자동 답변, llm_calls=2, cached=false
✔ #3 · HTTP 200 · 2.51s · route=자동 답변, llm_calls=2, cached=false
✔ #4 · HTTP 200 · 2.39s · route=자동 답변, llm_calls=2, cached=false
✔ #5 · HTTP 200 · 2.12s · route=자동 답변, llm_calls=2, cached=false
p50 2.45s · p95 2.51s · max 2.51s · failures 0/5
report: runs/bench-my-helpdesk-20261024-174654.json
+319
View File
@@ -0,0 +1,319 @@
{
"cases": "lab02.json",
"webhook": "my-helpdesk",
"passed": 9,
"total": 9,
"results": [
{
"case": "예제 1 · 프린터 FAQ는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.9,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-004"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 76,
"answer_ms": 1837,
"review_ms": 1048,
"total_ms": 2981
}
}
},
{
"case": "예제 1 · 접수 번호는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.1,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 32,
"answer_ms": 911,
"review_ms": 1002,
"total_ms": 1957
}
}
},
{
"case": "예제 1 · 없는 접수 번호",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.0,
"status": 200,
"request": {
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 현재 확인되지 않습니다. 담당 직원이 확인 후 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 40,
"answer_ms": 1008,
"review_ms": 870,
"total_ms": 1932
}
}
},
{
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.6,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 32,
"classify_ms": 767,
"answer_ms": 810,
"review_ms": 962,
"total_ms": 2586
}
}
},
{
"case": "예제 2 · 처음 묻는 VPN",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 58,
"answer_ms": 1140,
"review_ms": 929,
"total_ms": 2143
}
}
},
{
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 34
}
}
},
{
"case": "예제 2 · no_cache면 캐시 안 씀",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.3,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 33,
"answer_ms": 1024,
"review_ms": 1125,
"total_ms": 2194
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.2,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 35,
"answer_ms": 964,
"review_ms": 1161,
"total_ms": 2173
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.2,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 27,
"answer_ms": 886,
"review_ms": 1239,
"total_ms": 2168
}
}
}
]
}
+261
View File
@@ -0,0 +1,261 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 3.9s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
"sources": [
"FAQ-004"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 76,
"answer_ms": 1837,
"review_ms": 1048,
"total_ms": 2981
}
}
✔ 예제 1 · 접수 번호는 규칙으로 · 2.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 32,
"answer_ms": 911,
"review_ms": 1002,
"total_ms": 1957
}
}
✔ 예제 1 · 없는 접수 번호 · 2.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 현재 확인되지 않습니다. 담당 직원이 확인 후 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 40,
"answer_ms": 1008,
"review_ms": 870,
"total_ms": 1932
}
}
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 2.6s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 32,
"classify_ms": 767,
"answer_ms": 810,
"review_ms": 962,
"total_ms": 2586
}
}
✔ 예제 2 · 처음 묻는 VPN · 2.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 58,
"answer_ms": 1140,
"review_ms": 929,
"total_ms": 2143
}
}
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 34
}
}
✔ 예제 2 · no_cache면 캐시 안 씀 · 2.3s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 33,
"answer_ms": 1024,
"review_ms": 1125,
"total_ms": 2194
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 2.2s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 35,
"answer_ms": 964,
"review_ms": 1161,
"total_ms": 2173
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 2.2s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 27,
"answer_ms": 886,
"review_ms": 1239,
"total_ms": 2168
}
}
Passed 9/9
report: runs/lab02-20261024-174725.json
+134
View File
@@ -0,0 +1,134 @@
{
"cases": "lab01.json",
"webhook": "my-helpdesk",
"passed": 3,
"total": 4,
"results": [
{
"case": "VPN FAQ · 단계별 시간",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 34,
"answer_ms": 1125,
"review_ms": 852,
"total_ms": 2029
}
}
},
{
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 30,
"answer_ms": 1182,
"review_ms": 890,
"total_ms": 2114
}
}
},
{
"case": "접수 현황",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"answer has none of ['처리 중']"
],
"seconds": 2.1,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 50,
"answer_ms": 884,
"review_ms": 1046,
"total_ms": 1992
}
}
},
{
"case": "빈 질문",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
+103
View File
@@ -0,0 +1,103 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ VPN FAQ · 단계별 시간 · 2.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 34,
"answer_ms": 1125,
"review_ms": 852,
"total_ms": 2029
}
}
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 30,
"answer_ms": 1182,
"review_ms": 890,
"total_ms": 2114
}
}
✘ 접수 현황 · 2.1s · answer has none of ['처리 중']
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 50,
"answer_ms": 884,
"review_ms": 1046,
"total_ms": 1992
}
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 3/4
report: runs/lab01-20261024-174732.json
+3
View File
@@ -0,0 +1,3 @@
$ curl -s localhost:8800/cache-stats; echo
{"entries": 2, "hits": 4, "misses": 8}
@@ -0,0 +1,26 @@
$ curl -s -XPOST localhost:8800/cache-clear; echo
{"cleared": 2}
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn.json -n 5
POST http://localhost:5678/webhook/my-helpdesk × 5
✔ #1 · HTTP 200 · 2.07s · route=자동 답변, llm_calls=2, cached=false
✔ #2 · HTTP 200 · 0.06s · route=자동 답변, llm_calls=0, cached=true
✔ #3 · HTTP 200 · 0.05s · route=자동 답변, llm_calls=0, cached=true
✔ #4 · HTTP 200 · 0.04s · route=자동 답변, llm_calls=0, cached=true
✔ #5 · HTTP 200 · 0.05s · route=자동 답변, llm_calls=0, cached=true
p50 0.05s · p95 2.07s · max 2.07s · failures 0/5
report: runs/bench-my-helpdesk-20261024-174734.json
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn-nocache.json -n 5
POST http://localhost:5678/webhook/my-helpdesk × 5
✔ #1 · HTTP 200 · 1.99s · route=자동 답변, llm_calls=2, cached=false
✔ #2 · HTTP 200 · 1.98s · route=자동 답변, llm_calls=2, cached=false
✔ #3 · HTTP 200 · 2.21s · route=자동 답변, llm_calls=2, cached=false
✔ #4 · HTTP 200 · 1.97s · route=자동 답변, llm_calls=2, cached=false
✔ #5 · HTTP 200 · 2.24s · route=자동 답변, llm_calls=2, cached=false
p50 1.99s · p95 2.24s · max 2.24s · failures 0/5
report: runs/bench-my-helpdesk-20261024-174745.json
$ curl -s localhost:8800/cache-stats; echo
{"entries": 1, "hits": 9, "misses": 1}
@@ -0,0 +1,177 @@
{
"cases": "lab02-challenge.json",
"webhook": "my-helpdesk",
"passed": 1,
"total": 5,
"results": [
{
"case": "VPN · LLM 한 번 · 2.5초 안",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"llm_calls = 2 (expected 1)"
],
"seconds": 2.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 33,
"answer_ms": 1054,
"review_ms": 1038,
"total_ms": 2141
}
}
},
{
"case": "비밀번호 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"llm_calls = 2 (expected 1)"
],
"seconds": 2.0,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 언제든 문의해 주시기 바랍니다.",
"sources": [
"FAQ-001"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 72,
"answer_ms": 943,
"review_ms": 950,
"total_ms": 1984
}
}
},
{
"case": "접수 현황 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"llm_calls = 2 (expected 1)"
],
"seconds": 2.3,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 26,
"answer_ms": 932,
"review_ms": 1241,
"total_ms": 2213
}
}
},
{
"case": "규칙으로 모르면 분류 + 답 두 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"llm_calls = 3 (expected 2)"
],
"seconds": 2.8,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 27,
"classify_ms": 730,
"answer_ms": 1041,
"review_ms": 926,
"total_ms": 2736
}
}
},
{
"case": "빈 질문은 LLM 없이",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
@@ -0,0 +1,135 @@
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 2.0s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직
POST http://localhost:5678/webhook/my-helpdesk · 5 case(s) × 1
✘ VPN · LLM 한 번 · 2.5초 안 · 2.2s · llm_calls = 2 (expected 1)
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 33,
"answer_ms": 1054,
"review_ms": 1038,
"total_ms": 2141
}
}
✘ 비밀번호 · LLM 한 번 · 2.0s · llm_calls = 2 (expected 1)
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 언제든 문의해 주시기 바랍니다.",
"sources": [
"FAQ-001"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 72,
"answer_ms": 943,
"review_ms": 950,
"total_ms": 1984
}
}
✘ 접수 현황 · LLM 한 번 · 2.3s · llm_calls = 2 (expected 1)
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 26,
"answer_ms": 932,
"review_ms": 1241,
"total_ms": 2213
}
}
✘ 규칙으로 모르면 분류 + 답 두 번 · 2.8s · llm_calls = 3 (expected 2)
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
"sources": [],
"llm_calls": 3,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 27,
"classify_ms": 730,
"answer_ms": 1041,
"review_ms": 926,
"total_ms": 2736
}
}
✔ 빈 질문은 LLM 없이 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 1/5
report: runs/lab02-challenge-20261024-174756.json
+10
View File
@@ -0,0 +1,10 @@
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn-nocache.json -n 5
POST http://localhost:5678/webhook/my-helpdesk × 5
✔ #1 · HTTP 200 · 2.26s · route=자동 답변, llm_calls=2, cached=false
✔ #2 · HTTP 200 · 2.45s · route=자동 답변, llm_calls=2, cached=false
✔ #3 · HTTP 200 · 2.11s · route=자동 답변, llm_calls=2, cached=false
✔ #4 · HTTP 200 · 2.22s · route=자동 답변, llm_calls=2, cached=false
✔ #5 · HTTP 200 · 2.03s · route=자동 답변, llm_calls=2, cached=false
p50 2.22s · p95 2.45s · max 2.45s · failures 0/5
report: runs/bench-my-helpdesk-20261024-174807.json
+491
View File
@@ -0,0 +1,491 @@
{
"cases": "lab02-challenge.json",
"webhook": "my-helpdesk",
"passed": 15,
"total": 15,
"results": [
{
"case": "VPN · LLM 한 번 · 2.5초 안",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 37,
"answer_ms": 986,
"review_ms": 11,
"total_ms": 1046
}
}
},
{
"case": "VPN · LLM 한 번 · 2.5초 안",
"webhook": "my-helpdesk",
"run": 2,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 1057,
"review_ms": 14,
"total_ms": 1107
}
}
},
{
"case": "VPN · LLM 한 번 · 2.5초 안",
"webhook": "my-helpdesk",
"run": 3,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 41,
"answer_ms": 952,
"review_ms": 20,
"total_ms": 1023
}
}
},
{
"case": "비밀번호 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 도움이 필요하시면 언제든 문의해 주세요.",
"sources": [
"FAQ-001"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 81,
"answer_ms": 868,
"review_ms": 16,
"total_ms": 974
}
}
},
{
"case": "비밀번호 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 2,
"passed": true,
"problems": [],
"seconds": 0.9,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-001"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 32,
"answer_ms": 824,
"review_ms": 15,
"total_ms": 881
}
}
},
{
"case": "비밀번호 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 3,
"passed": true,
"problems": [],
"seconds": 0.9,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-001"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 48,
"answer_ms": 811,
"review_ms": 12,
"total_ms": 879
}
}
},
{
"case": "접수 현황 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.9,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 29,
"answer_ms": 798,
"review_ms": 15,
"total_ms": 848
}
}
},
{
"case": "접수 현황 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 2,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 924,
"review_ms": 12,
"total_ms": 971
}
}
},
{
"case": "접수 현황 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 3,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 30,
"answer_ms": 1001,
"review_ms": 45,
"total_ms": 1096
}
}
},
{
"case": "규칙으로 모르면 분류 + 답 두 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.6,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 23,
"classify_ms": 723,
"answer_ms": 838,
"review_ms": 15,
"total_ms": 1606
}
}
},
{
"case": "규칙으로 모르면 분류 + 답 두 번",
"webhook": "my-helpdesk",
"run": 2,
"passed": true,
"problems": [],
"seconds": 1.4,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"classify_ms": 594,
"answer_ms": 698,
"review_ms": 13,
"total_ms": 1339
}
}
},
{
"case": "규칙으로 모르면 분류 + 답 두 번",
"webhook": "my-helpdesk",
"run": 3,
"passed": true,
"problems": [],
"seconds": 1.6,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 30,
"classify_ms": 746,
"answer_ms": 801,
"review_ms": 15,
"total_ms": 1599
}
}
},
{
"case": "빈 질문은 LLM 없이",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
},
{
"case": "빈 질문은 LLM 없이",
"webhook": "my-helpdesk",
"run": 2,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
},
{
"case": "빈 질문은 LLM 없이",
"webhook": "my-helpdesk",
"run": 3,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
+397
View File
@@ -0,0 +1,397 @@
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 2.4s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
POST http://localhost:5678/webhook/my-helpdesk · 5 case(s) × 3
✔ VPN · LLM 한 번 · 2.5초 안 #1 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 37,
"answer_ms": 986,
"review_ms": 11,
"total_ms": 1046
}
}
✔ VPN · LLM 한 번 · 2.5초 안 #2 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 1057,
"review_ms": 14,
"total_ms": 1107
}
}
✔ VPN · LLM 한 번 · 2.5초 안 #3 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 41,
"answer_ms": 952,
"review_ms": 20,
"total_ms": 1023
}
}
✔ 비밀번호 · LLM 한 번 #1 · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 도움이 필요하시면 언제든 문의해 주세요.",
"sources": [
"FAQ-001"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 81,
"answer_ms": 868,
"review_ms": 16,
"total_ms": 974
}
}
✔ 비밀번호 · LLM 한 번 #2 · 0.9s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-001"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 32,
"answer_ms": 824,
"review_ms": 15,
"total_ms": 881
}
}
✔ 비밀번호 · LLM 한 번 #3 · 0.9s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-001"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 48,
"answer_ms": 811,
"review_ms": 12,
"total_ms": 879
}
}
✔ 접수 현황 · LLM 한 번 #1 · 0.9s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 29,
"answer_ms": 798,
"review_ms": 15,
"total_ms": 848
}
}
✔ 접수 현황 · LLM 한 번 #2 · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 924,
"review_ms": 12,
"total_ms": 971
}
}
✔ 접수 현황 · LLM 한 번 #3 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 30,
"answer_ms": 1001,
"review_ms": 45,
"total_ms": 1096
}
}
✔ 규칙으로 모르면 분류 + 답 두 번 #1 · 1.6s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 23,
"classify_ms": 723,
"answer_ms": 838,
"review_ms": 15,
"total_ms": 1606
}
}
✔ 규칙으로 모르면 분류 + 답 두 번 #2 · 1.4s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"classify_ms": 594,
"answer_ms": 698,
"review_ms": 13,
"total_ms": 1339
}
}
✔ 규칙으로 모르면 분류 + 답 두 번 #3 · 1.6s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 30,
"classify_ms": 746,
"answer_ms": 801,
"review_ms": 15,
"total_ms": 1599
}
}
✔ 빈 질문은 LLM 없이 #1 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
✔ 빈 질문은 LLM 없이 #2 · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
✔ 빈 질문은 LLM 없이 #3 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 15/15
report: runs/lab02-challenge-20261024-174837.json
@@ -0,0 +1,319 @@
{
"cases": "lab02.json",
"webhook": "my-helpdesk",
"passed": 9,
"total": 9,
"results": [
{
"case": "예제 1 · 프린터 FAQ는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 999,
"review_ms": 15,
"total_ms": 1047
}
}
},
{
"case": "예제 1 · 접수 번호는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.9,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 29,
"answer_ms": 802,
"review_ms": 50,
"total_ms": 899
}
}
},
{
"case": "예제 1 · 없는 접수 번호",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 901,
"review_ms": 15,
"total_ms": 951
}
}
},
{
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.6,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 30,
"classify_ms": 572,
"answer_ms": 898,
"review_ms": 14,
"total_ms": 1522
}
}
},
{
"case": "예제 2 · 처음 묻는 VPN",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 26,
"answer_ms": 1106,
"review_ms": 11,
"total_ms": 1149
}
}
},
{
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 21
}
}
},
{
"case": "예제 2 · no_cache면 캐시 안 씀",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 22,
"answer_ms": 1013,
"review_ms": 21,
"total_ms": 1063
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 25,
"answer_ms": 989,
"review_ms": 33,
"total_ms": 1069
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.9,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 24,
"answer_ms": 786,
"review_ms": 17,
"total_ms": 838
}
}
}
]
}
@@ -0,0 +1,261 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 999,
"review_ms": 15,
"total_ms": 1047
}
}
✔ 예제 1 · 접수 번호는 규칙으로 · 0.9s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 29,
"answer_ms": 802,
"review_ms": 50,
"total_ms": 899
}
}
✔ 예제 1 · 없는 접수 번호 · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 901,
"review_ms": 15,
"total_ms": 951
}
}
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 1.6s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 30,
"classify_ms": 572,
"answer_ms": 898,
"review_ms": 14,
"total_ms": 1522
}
}
✔ 예제 2 · 처음 묻는 VPN · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 26,
"answer_ms": 1106,
"review_ms": 11,
"total_ms": 1149
}
}
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 21
}
}
✔ 예제 2 · no_cache면 캐시 안 씀 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 22,
"answer_ms": 1013,
"review_ms": 21,
"total_ms": 1063
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 25,
"answer_ms": 989,
"review_ms": 33,
"total_ms": 1069
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 0.9s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 24,
"answer_ms": 786,
"review_ms": 17,
"total_ms": 838
}
}
Passed 9/9
report: runs/lab02-20261024-174846.json
@@ -0,0 +1,132 @@
{
"cases": "lab01.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "VPN FAQ · 단계별 시간",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 32,
"answer_ms": 1122,
"review_ms": 11,
"total_ms": 1173
}
}
},
{
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.3,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 1219,
"review_ms": 14,
"total_ms": 1268
}
}
},
{
"case": "접수 현황",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 907,
"review_ms": 15,
"total_ms": 956
}
}
},
{
"case": "빈 질문",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
@@ -0,0 +1,103 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ VPN FAQ · 단계별 시간 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 32,
"answer_ms": 1122,
"review_ms": 11,
"total_ms": 1173
}
}
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 1.3s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 1219,
"review_ms": 14,
"total_ms": 1268
}
}
✔ 접수 현황 · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 907,
"review_ms": 15,
"total_ms": 956
}
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 4/4
report: runs/lab01-20261024-174849.json
+10
View File
@@ -0,0 +1,10 @@
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn-nocache.json -n 5
POST http://localhost:5678/webhook/my-helpdesk × 5
✔ #1 · HTTP 200 · 1.32s · route=자동 답변, llm_calls=1, cached=false
✔ #2 · HTTP 200 · 1.14s · route=자동 답변, llm_calls=1, cached=false
✔ #3 · HTTP 200 · 1.11s · route=자동 답변, llm_calls=1, cached=false
✔ #4 · HTTP 200 · 1.12s · route=자동 답변, llm_calls=1, cached=false
✔ #5 · HTTP 200 · 1.05s · route=자동 답변, llm_calls=1, cached=false
p50 1.12s · p95 1.32s · max 1.32s · failures 0/5
report: runs/bench-my-helpdesk-20261024-174855.json
@@ -0,0 +1,223 @@
{
"cases": "lab02-challenge2.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 6,
"results": [
{
"case": "처음 묻는 VPN (캐시 없음)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 39,
"answer_ms": 947,
"review_ms": 16,
"total_ms": 1009
}
}
},
{
"case": "다른 말로 묻는 VPN → FAQ 번호 캐시",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"took 1.2s (expected at most 1s)",
"cached = false (expected true)",
"cache_by = null (expected faq)",
"llm_calls = 1 (expected 0)"
],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 연결이 계속 끊어지는데요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 현재 접수된 관련 티켓은 없습니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 1067,
"review_ms": 14,
"total_ms": 1117
}
}
},
{
"case": "같은 말은 질문 캐시",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"cache_by = null (expected question)"
],
"seconds": 0.1,
"status": 200,
"request": {
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 14
}
}
},
{
"case": "no_cache면 FAQ 번호 캐시도 안 씀",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "VPN 연결이 계속 끊어지는데요",
"user": "최유진",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 21,
"answer_ms": 1014,
"review_ms": 9,
"total_ms": 1051
}
}
},
{
"case": "다른 FAQ는 따로 (프린터 처음)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 26,
"answer_ms": 1041,
"review_ms": 17,
"total_ms": 1091
}
}
},
{
"case": "접수 현황은 캐시 안 함",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.9,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 25,
"answer_ms": 869,
"review_ms": 13,
"total_ms": 913
}
}
}
]
}
@@ -0,0 +1,176 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 2}
POST http://localhost:5678/webhook/my-helpdesk · 6 case(s) × 1
✔ 처음 묻는 VPN (캐시 없음) · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 39,
"answer_ms": 947,
"review_ms": 16,
"total_ms": 1009
}
}
✘ 다른 말로 묻는 VPN → FAQ 번호 캐시 · 1.2s · took 1.2s (expected at most 1s); cached = false (expected true); cache_by = null (expected faq); llm_calls = 1 (expected 0)
→ request POST /webhook/my-helpdesk
{
"question": "VPN 연결이 계속 끊어지는데요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 현재 접수된 관련 티켓은 없습니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 1067,
"review_ms": 14,
"total_ms": 1117
}
}
✘ 같은 말은 질문 캐시 · 0.1s · cache_by = null (expected question)
→ request POST /webhook/my-helpdesk
{
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 14
}
}
✔ no_cache면 FAQ 번호 캐시도 안 씀 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 연결이 계속 끊어지는데요",
"user": "최유진",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 21,
"answer_ms": 1014,
"review_ms": 9,
"total_ms": 1051
}
}
✔ 다른 FAQ는 따로 (프린터 처음) · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 26,
"answer_ms": 1041,
"review_ms": 17,
"total_ms": 1091
}
}
✔ 접수 현황은 캐시 안 함 · 0.9s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 25,
"answer_ms": 869,
"review_ms": 13,
"total_ms": 913
}
}
Passed 4/6
report: runs/lab02-challenge2-20261024-174901.json
@@ -0,0 +1,217 @@
{
"cases": "lab02-challenge2.json",
"webhook": "my-helpdesk",
"passed": 6,
"total": 6,
"results": [
{
"case": "처음 묻는 VPN (캐시 없음)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.5,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 71,
"answer_ms": 1556,
"review_ms": 23,
"total_ms": 1665
}
}
},
{
"case": "다른 말로 묻는 VPN → FAQ 번호 캐시",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": "VPN 연결이 계속 끊어지는데요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"cache_by": "faq",
"steps": [
"faq",
"rule",
"cache"
],
"timings": {
"total_ms": 44
}
}
},
{
"case": "같은 말은 질문 캐시",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 200,
"request": {
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"cache_by": "question",
"steps": [
"cache"
],
"timings": {
"total_ms": 19
}
}
},
{
"case": "no_cache면 FAQ 번호 캐시도 안 씀",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 연결이 계속 끊어지는데요",
"user": "최유진",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 현재 접수된 관련 티켓은 없습니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 1052,
"review_ms": 20,
"total_ms": 1110
}
}
},
{
"case": "다른 FAQ는 따로 (프린터 처음)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 42,
"answer_ms": 1035,
"review_ms": 14,
"total_ms": 1102
}
}
},
{
"case": "접수 현황은 캐시 안 함",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 34,
"answer_ms": 796,
"review_ms": 14,
"total_ms": 852
}
}
}
]
}
+177
View File
@@ -0,0 +1,177 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 3}
POST http://localhost:5678/webhook/my-helpdesk · 6 case(s) × 1
✔ 처음 묻는 VPN (캐시 없음) · 2.5s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 71,
"answer_ms": 1556,
"review_ms": 23,
"total_ms": 1665
}
}
✔ 다른 말로 묻는 VPN → FAQ 번호 캐시 · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 연결이 계속 끊어지는데요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"cache_by": "faq",
"steps": [
"faq",
"rule",
"cache"
],
"timings": {
"total_ms": 44
}
}
✔ 같은 말은 질문 캐시 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"cache_by": "question",
"steps": [
"cache"
],
"timings": {
"total_ms": 19
}
}
✔ no_cache면 FAQ 번호 캐시도 안 씀 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 연결이 계속 끊어지는데요",
"user": "최유진",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 현재 접수된 관련 티켓은 없습니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 1052,
"review_ms": 20,
"total_ms": 1110
}
}
✔ 다른 FAQ는 따로 (프린터 처음) · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 42,
"answer_ms": 1035,
"review_ms": 14,
"total_ms": 1102
}
}
✔ 접수 현황은 캐시 안 함 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 34,
"answer_ms": 796,
"review_ms": 14,
"total_ms": 852
}
}
Passed 6/6
report: runs/lab02-challenge2-20261024-174920.json
@@ -0,0 +1,173 @@
{
"cases": "lab02-challenge.json",
"webhook": "my-helpdesk",
"passed": 5,
"total": 5,
"results": [
{
"case": "VPN · LLM 한 번 · 2.5초 안",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 1017,
"review_ms": 16,
"total_ms": 1067
}
}
},
{
"case": "비밀번호 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 도움이 필요하시면 언제든 문의해 주세요.",
"sources": [
"FAQ-001"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 840,
"review_ms": 40,
"total_ms": 928
}
}
},
{
"case": "접수 현황 · LLM 한 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.9,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 835,
"review_ms": 19,
"total_ms": 891
}
}
},
{
"case": "규칙으로 모르면 분류 + 답 두 번",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.7,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"classify_ms": 842,
"answer_ms": 771,
"review_ms": 11,
"total_ms": 1659
}
}
},
{
"case": "빈 질문은 LLM 없이",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
@@ -0,0 +1,139 @@
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 1.1s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
POST http://localhost:5678/webhook/my-helpdesk · 5 case(s) × 1
✔ VPN · LLM 한 번 · 2.5초 안 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 1017,
"review_ms": 16,
"total_ms": 1067
}
}
✔ 비밀번호 · LLM 한 번 · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 도움이 필요하시면 언제든 문의해 주세요.",
"sources": [
"FAQ-001"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 840,
"review_ms": 40,
"total_ms": 928
}
}
✔ 접수 현황 · LLM 한 번 · 0.9s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 28,
"answer_ms": 835,
"review_ms": 19,
"total_ms": 891
}
}
✔ 규칙으로 모르면 분류 + 답 두 번 · 1.7s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"classify_ms": 842,
"answer_ms": 771,
"review_ms": 11,
"total_ms": 1659
}
}
✔ 빈 질문은 LLM 없이 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 5/5
report: runs/lab02-challenge-20261024-174926.json
+328
View File
@@ -0,0 +1,328 @@
{
"cases": "lab02.json",
"webhook": "my-helpdesk",
"passed": 9,
"total": 9,
"results": [
{
"case": "예제 1 · 프린터 FAQ는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 33,
"answer_ms": 1111,
"review_ms": 17,
"total_ms": 1168
}
}
},
{
"case": "예제 1 · 접수 번호는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 895,
"review_ms": 16,
"total_ms": 945
}
}
},
{
"case": "예제 1 · 없는 접수 번호",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 25,
"answer_ms": 946,
"review_ms": 17,
"total_ms": 998
}
}
},
{
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.7,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 25,
"classify_ms": 623,
"answer_ms": 1026,
"review_ms": 14,
"total_ms": 1699
}
}
},
{
"case": "예제 2 · 처음 묻는 VPN",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 1112,
"review_ms": 23,
"total_ms": 1168
}
}
},
{
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 200,
"request": {
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"cache_by": "question",
"steps": [
"cache"
],
"timings": {
"total_ms": 15
}
}
},
{
"case": "예제 2 · no_cache면 캐시 안 씀",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 21,
"answer_ms": 1065,
"review_ms": 32,
"total_ms": 1137
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 30,
"answer_ms": 936,
"review_ms": 15,
"total_ms": 988
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.9,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 31,
"answer_ms": 822,
"review_ms": 14,
"total_ms": 873
}
}
}
]
}
+270
View File
@@ -0,0 +1,270 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 4}
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 33,
"answer_ms": 1111,
"review_ms": 17,
"total_ms": 1168
}
}
✔ 예제 1 · 접수 번호는 규칙으로 · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 895,
"review_ms": 16,
"total_ms": 945
}
}
✔ 예제 1 · 없는 접수 번호 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 25,
"answer_ms": 946,
"review_ms": 17,
"total_ms": 998
}
}
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 1.7s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 25,
"classify_ms": 623,
"answer_ms": 1026,
"review_ms": 14,
"total_ms": 1699
}
}
✔ 예제 2 · 처음 묻는 VPN · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 1112,
"review_ms": 23,
"total_ms": 1168
}
}
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"cache_by": "question",
"steps": [
"cache"
],
"timings": {
"total_ms": 15
}
}
✔ 예제 2 · no_cache면 캐시 안 씀 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 21,
"answer_ms": 1065,
"review_ms": 32,
"total_ms": 1137
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 30,
"answer_ms": 936,
"review_ms": 15,
"total_ms": 988
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 0.9s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"cache_by": null,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 31,
"answer_ms": 822,
"review_ms": 14,
"total_ms": 873
}
}
Passed 9/9
report: runs/lab02-20261024-174935.json
@@ -0,0 +1,53 @@
$ uv run tools/flow.py fault faq slow
✔ fault switch: {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
$ uv run tools/flow.py call my-helpdesk '{"question": "비밀번호를 잊어버렸어요", "no_cache": true}' -v
HTTP 200 · 11.5s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 언제든 문의해 주세요.",
"sources": [
"FAQ-001"
],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"review"
],
"timings": {
"data_ms": 8144,
"answer_ms": 1518,
"review_ms": 1013,
"total_ms": 10701
}
}
$ uv run tools/flow.py fault faq error
✔ fault switch: {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
$ uv run tools/flow.py call my-helpdesk '{"question": "비밀번호를 잊어버렸어요", "no_cache": true}' -v
HTTP 500 · 0.3s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"no_cache": true
}
← response HTTP 500
{
"message": "Error in workflow"
}
$ uv run tools/flow.py fault all ok
✔ fault switch: {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
+112
View File
@@ -0,0 +1,112 @@
{
"cases": "lab03.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "평소",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 605,
"answer_ms": 1634,
"review_ms": 13,
"total_ms": 2270
}
}
},
{
"case": "FAQ가 느릴 때 (8초)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.6,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "FAQ가 오류일 때 (500)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.6,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "캐시에 있으면 FAQ가 멈춰도 답",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 21
}
}
}
]
}
+92
View File
@@ -0,0 +1,92 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 평소 · 3.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 605,
"answer_ms": 1634,
"review_ms": 13,
"total_ms": 2270
}
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ가 느릴 때 (8초) · 4.6s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ가 오류일 때 (500) · 0.6s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 4}
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 2.1s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ 캐시에 있으면 FAQ가 멈춰도 답 · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 21
}
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
Passed 4/4
report: runs/lab03-20261024-175023.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
+319
View File
@@ -0,0 +1,319 @@
{
"cases": "lab02.json",
"webhook": "my-helpdesk",
"passed": 9,
"total": 9,
"results": [
{
"case": "예제 1 · 프린터 FAQ는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.8,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 585,
"answer_ms": 1071,
"review_ms": 20,
"total_ms": 1687
}
}
},
{
"case": "예제 1 · 접수 번호는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 71,
"answer_ms": 1030,
"review_ms": 19,
"total_ms": 1128
}
}
},
{
"case": "예제 1 · 없는 접수 번호",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.8,
"status": 200,
"request": {
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 555,
"answer_ms": 1179,
"review_ms": 24,
"total_ms": 1774
}
}
},
{
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.2,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 554,
"classify_ms": 650,
"answer_ms": 927,
"review_ms": 14,
"total_ms": 2152
}
}
},
{
"case": "예제 2 · 처음 묻는 VPN",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 553,
"answer_ms": 1015,
"review_ms": 28,
"total_ms": 1605
}
}
},
{
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 19
}
}
},
{
"case": "예제 2 · no_cache면 캐시 안 씀",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류는 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 551,
"answer_ms": 1081,
"review_ms": 34,
"total_ms": 1685
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 31,
"answer_ms": 1062,
"review_ms": 14,
"total_ms": 1114
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 47,
"answer_ms": 977,
"review_ms": 15,
"total_ms": 1049
}
}
}
]
}
+261
View File
@@ -0,0 +1,261 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 1.8s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 585,
"answer_ms": 1071,
"review_ms": 20,
"total_ms": 1687
}
}
✔ 예제 1 · 접수 번호는 규칙으로 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 71,
"answer_ms": 1030,
"review_ms": 19,
"total_ms": 1128
}
}
✔ 예제 1 · 없는 접수 번호 · 1.8s
→ request POST /webhook/my-helpdesk
{
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 555,
"answer_ms": 1179,
"review_ms": 24,
"total_ms": 1774
}
}
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 2.2s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 554,
"classify_ms": 650,
"answer_ms": 927,
"review_ms": 14,
"total_ms": 2152
}
}
✔ 예제 2 · 처음 묻는 VPN · 1.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 553,
"answer_ms": 1015,
"review_ms": 28,
"total_ms": 1605
}
}
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 19
}
}
✔ 예제 2 · no_cache면 캐시 안 씀 · 1.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류는 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 551,
"answer_ms": 1081,
"review_ms": 34,
"total_ms": 1685
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 31,
"answer_ms": 1062,
"review_ms": 14,
"total_ms": 1114
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 47,
"answer_ms": 977,
"review_ms": 15,
"total_ms": 1049
}
}
Passed 9/9
report: runs/lab02-20261024-175036.json
@@ -0,0 +1,19 @@
$ uv run tools/flow.py llm down
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
$ uv run tools/flow.py call my-helpdesk requests/faq-vpn-nocache.json -v
HTTP 500 · 1.3s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 500
{
"message": "Error in workflow"
}
$ uv run tools/flow.py llm up
✔ OpenAI credential: real key from .env restored
@@ -0,0 +1,84 @@
{
"cases": "lab03-llm-down.json",
"webhook": "my-helpdesk",
"passed": 1,
"total": 4,
"results": [
{
"case": "VPN · FAQ 원문으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"status 500 (expected 200)",
"route = null (expected 간단 답변)",
"answer has none of ['인증서']"
],
"seconds": 0.9,
"status": 500,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"message": "Error in workflow"
}
},
{
"case": "접수 현황 · 상태 그대로",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"status 500 (expected 200)",
"route = null (expected 간단 답변)",
"answer has none of ['처리 중']"
],
"seconds": 0.4,
"status": 500,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"message": "Error in workflow"
}
},
{
"case": "모르는 질문 · 담당자",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"status 500 (expected 200)",
"route = null (expected 담당자 연결)"
],
"seconds": 0.9,
"status": 500,
"request": {
"question": "오늘 점심 메뉴 추천해 주세요",
"user": "이준호"
},
"response": {
"message": "Error in workflow"
}
},
{
"case": "빈 질문",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
@@ -0,0 +1,47 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 2}
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✘ VPN · FAQ 원문으로 · 0.9s · status 500 (expected 200); route = null (expected 간단 답변); answer has none of ['인증서']
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 500
{
"message": "Error in workflow"
}
✘ 접수 현황 · 상태 그대로 · 0.4s · status 500 (expected 200); route = null (expected 간단 답변); answer has none of ['처리 중']
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 500
{
"message": "Error in workflow"
}
✘ 모르는 질문 · 담당자 · 0.9s · status 500 (expected 200); route = null (expected 담당자 연결)
→ request POST /webhook/my-helpdesk
{
"question": "오늘 점심 메뉴 추천해 주세요",
"user": "이준호"
}
← response HTTP 500
{
"message": "Error in workflow"
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 1/4
report: runs/lab03-llm-down-20261024-175047.json
✔ OpenAI credential: real key from .env restored
@@ -0,0 +1,90 @@
{
"cases": "lab03-llm-down.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "VPN · FAQ 원문으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.6,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "간단 답변",
"category": "faq",
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다. (자동 답변 기능을 잠시 쓸 수 없어 FAQ 원문으로 안내합니다.)",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"reason": "llm_down"
}
},
{
"case": "접수 현황 · 상태 그대로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.3,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "간단 답변",
"category": "ticket",
"answer": "T-1002 접수 건은 현재 '처리 중' 상태입니다. 인증서 발급 승인 대기 중이며 10월 20일 완료 예정입니다.",
"sources": [],
"llm_calls": 0,
"reason": "llm_down"
}
},
{
"case": "모르는 질문 · 담당자",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.8,
"status": 200,
"request": {
"question": "오늘 점심 메뉴 추천해 주세요",
"user": "이준호"
},
"response": {
"route": "담당자 연결",
"category": "other",
"answer": "지금은 자동 답변을 할 수 없어 담당자에게 연결합니다.",
"sources": [],
"llm_calls": 0,
"reason": "llm_down"
}
},
{
"case": "빈 질문",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
+64
View File
@@ -0,0 +1,64 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ VPN · FAQ 원문으로 · 2.6s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "간단 답변",
"category": "faq",
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다. (자동 답변 기능을 잠시 쓸 수 없어 FAQ 원문으로 안내합니다.)",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"reason": "llm_down"
}
✔ 접수 현황 · 상태 그대로 · 0.3s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "간단 답변",
"category": "ticket",
"answer": "T-1002 접수 건은 현재 '처리 중' 상태입니다. 인증서 발급 승인 대기 중이며 10월 20일 완료 예정입니다.",
"sources": [],
"llm_calls": 0,
"reason": "llm_down"
}
✔ 모르는 질문 · 담당자 · 0.8s
→ request POST /webhook/my-helpdesk
{
"question": "오늘 점심 메뉴 추천해 주세요",
"user": "이준호"
}
← response HTTP 200
{
"route": "담당자 연결",
"category": "other",
"answer": "지금은 자동 답변을 할 수 없어 담당자에게 연결합니다.",
"sources": [],
"llm_calls": 0,
"reason": "llm_down"
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 4/4
report: runs/lab03-llm-down-20261024-175108.json
✔ OpenAI credential: real key from .env restored
@@ -0,0 +1,319 @@
{
"cases": "lab02.json",
"webhook": "my-helpdesk",
"passed": 9,
"total": 9,
"results": [
{
"case": "예제 1 · 프린터 FAQ는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.8,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 568,
"answer_ms": 1078,
"review_ms": 12,
"total_ms": 1679
}
}
},
{
"case": "예제 1 · 접수 번호는 규칙으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 38,
"answer_ms": 969,
"review_ms": 15,
"total_ms": 1032
}
}
},
{
"case": "예제 1 · 없는 접수 번호",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.7,
"status": 200,
"request": {
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드리겠습니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 546,
"answer_ms": 1011,
"review_ms": 46,
"total_ms": 1632
}
}
},
{
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.2,
"status": 200,
"request": {
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 560,
"classify_ms": 881,
"answer_ms": 734,
"review_ms": 23,
"total_ms": 2206
}
}
},
{
"case": "예제 2 · 처음 묻는 VPN",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.9,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 560,
"answer_ms": 1222,
"review_ms": 12,
"total_ms": 1803
}
}
},
{
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 20
}
}
},
{
"case": "예제 2 · no_cache면 캐시 안 씀",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 560,
"answer_ms": 1041,
"review_ms": 17,
"total_ms": 1625
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 934,
"review_ms": 19,
"total_ms": 986
}
}
},
{
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 31,
"answer_ms": 1016,
"review_ms": 43,
"total_ms": 1110
}
}
}
]
}
@@ -0,0 +1,261 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 1.8s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 568,
"answer_ms": 1078,
"review_ms": 12,
"total_ms": 1679
}
}
✔ 예제 1 · 접수 번호는 규칙으로 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 38,
"answer_ms": 969,
"review_ms": 15,
"total_ms": 1032
}
}
✔ 예제 1 · 없는 접수 번호 · 1.7s
→ request POST /webhook/my-helpdesk
{
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드리겠습니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 546,
"answer_ms": 1011,
"review_ms": 46,
"total_ms": 1632
}
}
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 2.2s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
"sources": [],
"llm_calls": 2,
"cached": false,
"steps": [
"rule",
"classify",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 560,
"classify_ms": 881,
"answer_ms": 734,
"review_ms": 23,
"total_ms": 2206
}
}
✔ 예제 2 · 처음 묻는 VPN · 1.9s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 560,
"answer_ms": 1222,
"review_ms": 12,
"total_ms": 1803
}
}
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 20
}
}
✔ 예제 2 · no_cache면 캐시 안 씀 · 1.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 560,
"answer_ms": 1041,
"review_ms": 17,
"total_ms": 1625
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 27,
"answer_ms": 934,
"review_ms": 19,
"total_ms": 986
}
}
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 31,
"answer_ms": 1016,
"review_ms": 43,
"total_ms": 1110
}
}
Passed 9/9
report: runs/lab02-20261024-175123.json
@@ -0,0 +1,112 @@
{
"cases": "lab03.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "평소",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 571,
"answer_ms": 1006,
"review_ms": 16,
"total_ms": 1600
}
}
},
{
"case": "FAQ가 느릴 때 (8초)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.6,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "FAQ가 오류일 때 (500)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.6,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "캐시에 있으면 FAQ가 멈춰도 답",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 21
}
}
}
]
}
@@ -0,0 +1,92 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 평소 · 1.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 571,
"answer_ms": 1006,
"review_ms": 16,
"total_ms": 1600
}
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ가 느릴 때 (8초) · 4.6s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ가 오류일 때 (500) · 0.6s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 2}
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 1.9s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ 캐시에 있으면 FAQ가 멈춰도 답 · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 21
}
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
Passed 4/4
report: runs/lab03-20261024-175132.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
@@ -0,0 +1,119 @@
{
"cases": "lab03-ticket.json",
"webhook": "my-helpdesk",
"passed": 2,
"total": 4,
"results": [
{
"case": "평소 접수 현황",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 33,
"answer_ms": 915,
"review_ms": 12,
"total_ms": 970
}
}
},
{
"case": "접수 API 500 · 접수 질문은 담당자",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"reason = data_api_down (expected tickets_down)"
],
"seconds": 0.6,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "접수 API 500 · FAQ 질문은 그대로 답",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"route = 담당자 연결 (expected 자동 답변)",
"category = null (expected faq)",
"answer has none of ['인증서']"
],
"seconds": 0.6,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "없는 접수 번호는 그대로 (404는 고장이 아님)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.6,
"status": 200,
"request": {
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 564,
"answer_ms": 978,
"review_ms": 10,
"total_ms": 1558
}
}
}
]
}
@@ -0,0 +1,90 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 평소 접수 현황 · 1.0s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 33,
"answer_ms": 915,
"review_ms": 12,
"total_ms": 970
}
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "error", "slow_seconds": 8.0}
✘ 접수 API 500 · 접수 질문은 담당자 · 0.6s · reason = data_api_down (expected tickets_down)
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "error", "slow_seconds": 8.0}
✘ 접수 API 500 · FAQ 질문은 그대로 답 · 0.6s · route = 담당자 연결 (expected 자동 답변); category = null (expected faq); answer has none of ['인증서']
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ 없는 접수 번호는 그대로 (404는 고장이 아님) · 1.6s
→ request POST /webhook/my-helpdesk
{
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 564,
"answer_ms": 978,
"review_ms": 10,
"total_ms": 1558
}
}
Passed 2/4
report: runs/lab03-ticket-20261024-175136.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
+133
View File
@@ -0,0 +1,133 @@
{
"cases": "lab03-ticket.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "평소 접수 현황",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.4,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 102,
"answer_ms": 1458,
"review_ms": 13,
"total_ms": 1594
}
}
},
{
"case": "접수 API 500 · 접수 질문은 담당자",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "담당자 연결",
"category": "ticket",
"answer": "접수 현황 시스템이 응답하지 않아 담당자에게 연결합니다. 잠시 뒤 다시 물어봐 주세요.",
"reason": "tickets_down",
"llm_calls": 0
}
},
{
"case": "접수 API 500 · FAQ 질문은 그대로 답",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 38,
"answer_ms": 1023,
"review_ms": 12,
"total_ms": 1083
}
}
},
{
"case": "없는 접수 번호는 그대로 (404는 고장이 아님)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.3,
"status": 200,
"request": {
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
},
"response": {
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 44,
"answer_ms": 1192,
"review_ms": 22,
"total_ms": 1270
}
}
}
]
}
+110
View File
@@ -0,0 +1,110 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 평소 접수 현황 · 2.4s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 102,
"answer_ms": 1458,
"review_ms": 13,
"total_ms": 1594
}
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "error", "slow_seconds": 8.0}
✔ 접수 API 500 · 접수 질문은 담당자 · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "담당자 연결",
"category": "ticket",
"answer": "접수 현황 시스템이 응답하지 않아 담당자에게 연결합니다. 잠시 뒤 다시 물어봐 주세요.",
"reason": "tickets_down",
"llm_calls": 0
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "error", "slow_seconds": 8.0}
✔ 접수 API 500 · FAQ 질문은 그대로 답 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 38,
"answer_ms": 1023,
"review_ms": 12,
"total_ms": 1083
}
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ 없는 접수 번호는 그대로 (404는 고장이 아님) · 1.3s
→ request POST /webhook/my-helpdesk
{
"question": "T-9999 접수 건은 어떻게 됐나요?",
"user": "박서연"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "ticket",
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
"sources": [],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 44,
"answer_ms": 1192,
"review_ms": 22,
"total_ms": 1270
}
}
Passed 4/4
report: runs/lab03-ticket-20261024-175154.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
@@ -0,0 +1,112 @@
{
"cases": "lab03.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "평소",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 61,
"answer_ms": 1037,
"review_ms": 14,
"total_ms": 1120
}
}
},
{
"case": "FAQ가 느릴 때 (8초)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.8,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "FAQ가 오류일 때 (500)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.6,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "캐시에 있으면 FAQ가 멈춰도 답",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 17
}
}
}
]
}
@@ -0,0 +1,92 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 평소 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 61,
"answer_ms": 1037,
"review_ms": 14,
"total_ms": 1120
}
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ가 느릴 때 (8초) · 4.8s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ가 오류일 때 (500) · 0.6s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 1.3s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ 캐시에 있으면 FAQ가 멈춰도 답 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 17
}
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
Passed 4/4
report: runs/lab03-20261024-175202.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
@@ -0,0 +1,90 @@
{
"cases": "lab03-llm-down.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "VPN · FAQ 원문으로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "간단 답변",
"category": "faq",
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다. (자동 답변 기능을 잠시 쓸 수 없어 FAQ 원문으로 안내합니다.)",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"reason": "llm_down"
}
},
{
"case": "접수 현황 · 상태 그대로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.5,
"status": 200,
"request": {
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
},
"response": {
"route": "간단 답변",
"category": "ticket",
"answer": "T-1002 접수 건은 현재 '처리 중' 상태입니다. 인증서 발급 승인 대기 중이며 10월 20일 완료 예정입니다.",
"sources": [],
"llm_calls": 0,
"reason": "llm_down"
}
},
{
"case": "모르는 질문 · 담당자",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.3,
"status": 200,
"request": {
"question": "오늘 점심 메뉴 추천해 주세요",
"user": "이준호"
},
"response": {
"route": "담당자 연결",
"category": "other",
"answer": "지금은 자동 답변을 할 수 없어 담당자에게 연결합니다.",
"sources": [],
"llm_calls": 0,
"reason": "llm_down"
}
},
{
"case": "빈 질문",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.0,
"status": 400,
"request": {
"question": "",
"user": "이준호"
},
"response": {
"error": "question is required"
}
}
]
}
@@ -0,0 +1,64 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ VPN · FAQ 원문으로 · 0.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "간단 답변",
"category": "faq",
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다. (자동 답변 기능을 잠시 쓸 수 없어 FAQ 원문으로 안내합니다.)",
"sources": [
"FAQ-003"
],
"llm_calls": 0,
"reason": "llm_down"
}
✔ 접수 현황 · 상태 그대로 · 0.5s
→ request POST /webhook/my-helpdesk
{
"question": "T-1002 처리 상태 알려 주세요",
"user": "박서연"
}
← response HTTP 200
{
"route": "간단 답변",
"category": "ticket",
"answer": "T-1002 접수 건은 현재 '처리 중' 상태입니다. 인증서 발급 승인 대기 중이며 10월 20일 완료 예정입니다.",
"sources": [],
"llm_calls": 0,
"reason": "llm_down"
}
✔ 모르는 질문 · 담당자 · 0.3s
→ request POST /webhook/my-helpdesk
{
"question": "오늘 점심 메뉴 추천해 주세요",
"user": "이준호"
}
← response HTTP 200
{
"route": "담당자 연결",
"category": "other",
"answer": "지금은 자동 답변을 할 수 없어 담당자에게 연결합니다.",
"sources": [],
"llm_calls": 0,
"reason": "llm_down"
}
✔ 빈 질문 · 0.0s
→ request POST /webhook/my-helpdesk
{
"question": "",
"user": "이준호"
}
← response HTTP 400
{
"error": "question is required"
}
Passed 4/4
report: runs/lab03-llm-down-20261024-175206.json
✔ OpenAI credential: real key from .env restored
@@ -0,0 +1,94 @@
{
"cases": "lab03-challenge.json",
"webhook": "my-health",
"passed": 4,
"total": 4,
"results": [
{
"case": "평소",
"webhook": "my-health",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.2,
"status": 200,
"request": {},
"response": {
"status": "ok",
"checks": {
"data_api": true,
"faq": true,
"llm": true
},
"failed": [],
"seconds": 1.4
}
},
{
"case": "FAQ 오류",
"webhook": "my-health",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.0,
"status": 200,
"request": {},
"response": {
"status": "degraded",
"checks": {
"data_api": true,
"faq": false,
"llm": true
},
"failed": [
"faq"
],
"seconds": 1
}
},
{
"case": "FAQ 느림 (8초) · 점검은 빨리 끝남",
"webhook": "my-health",
"run": 1,
"passed": true,
"problems": [],
"seconds": 3.0,
"status": 200,
"request": {},
"response": {
"status": "degraded",
"checks": {
"data_api": true,
"faq": false,
"llm": true
},
"failed": [
"faq"
],
"seconds": 2.9
}
},
{
"case": "LLM 멈춤",
"webhook": "my-health",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.4,
"status": 200,
"request": {},
"response": {
"status": "degraded",
"checks": {
"data_api": true,
"faq": true,
"llm": false
},
"failed": [
"llm"
],
"seconds": 0.3
}
}
]
}
@@ -0,0 +1,72 @@
POST http://localhost:5678/webhook/my-health · 4 case(s) × 1
✔ 평소 · 2.2s
→ request POST /webhook/my-health
{}
← response HTTP 200
{
"status": "ok",
"checks": {
"data_api": true,
"faq": true,
"llm": true
},
"failed": [],
"seconds": 1.4
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ 오류 · 1.0s
→ request POST /webhook/my-health
{}
← response HTTP 200
{
"status": "degraded",
"checks": {
"data_api": true,
"faq": false,
"llm": true
},
"failed": [
"faq"
],
"seconds": 1
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ 느림 (8초) · 점검은 빨리 끝남 · 3.0s
→ request POST /webhook/my-health
{}
← response HTTP 200
{
"status": "degraded",
"checks": {
"data_api": true,
"faq": false,
"llm": true
},
"failed": [
"faq"
],
"seconds": 2.9
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
✔ LLM 멈춤 · 0.4s
→ request POST /webhook/my-health
{}
← response HTTP 200
{
"status": "degraded",
"checks": {
"data_api": true,
"faq": true,
"llm": false
},
"failed": [
"llm"
],
"seconds": 0.3
}
✔ OpenAI credential: real key from .env restored
Passed 4/4
report: runs/lab03-challenge-20261024-175230.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
@@ -0,0 +1,123 @@
{
"cases": "lab03-challenge2.json",
"webhook": "my-helpdesk",
"passed": 3,
"total": 4,
"results": [
{
"case": "평소",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.3,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 72,
"answer_ms": 1098,
"review_ms": 18,
"total_ms": 1212
}
}
},
{
"case": "FAQ 느림 · 처음 한 번은 기다린 뒤 담당자",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.6,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "FAQ 느림 · 다음 질문은 기다리지 않음 (차단기 열림)",
"webhook": "my-helpdesk",
"run": 1,
"passed": false,
"problems": [
"took 4.6s (expected at most 1s)",
"reason = data_api_down (expected breaker_open)"
],
"seconds": 4.6,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "FAQ가 돌아오고 차단기를 비우면 평소대로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 43,
"answer_ms": 1092,
"review_ms": 15,
"total_ms": 1161
}
}
}
]
}
@@ -0,0 +1,97 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 평소 · 1.3s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 72,
"answer_ms": 1098,
"review_ms": 18,
"total_ms": 1212
}
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ 느림 · 처음 한 번은 기다린 뒤 담당자 · 4.6s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✘ FAQ 느림 · 다음 질문은 기다리지 않음 (차단기 열림) · 4.6s · took 4.6s (expected at most 1s); reason = data_api_down (expected breaker_open)
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
✔ FAQ가 돌아오고 차단기를 비우면 평소대로 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 43,
"answer_ms": 1092,
"review_ms": 15,
"total_ms": 1161
}
}
Passed 3/4
report: runs/lab03-challenge2-20261024-175242.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ after: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
@@ -0,0 +1,121 @@
{
"cases": "lab03-challenge2.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "평소",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 2.7,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 114,
"answer_ms": 1678,
"review_ms": 14,
"total_ms": 1827
}
}
},
{
"case": "FAQ 느림 · 처음 한 번은 기다린 뒤 담당자",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.8,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "FAQ 느림 · 다음 질문은 기다리지 않음 (차단기 열림)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "breaker_open",
"llm_calls": 0
}
},
{
"case": "FAQ가 돌아오고 차단기를 비우면 평소대로",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.1,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 52,
"answer_ms": 1005,
"review_ms": 18,
"total_ms": 1084
}
}
}
]
}
@@ -0,0 +1,98 @@
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 평소 · 2.7s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 114,
"answer_ms": 1678,
"review_ms": 14,
"total_ms": 1827
}
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ 느림 · 처음 한 번은 기다린 뒤 담당자 · 4.8s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ FAQ 느림 · 다음 질문은 기다리지 않음 (차단기 열림) · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "breaker_open",
"llm_calls": 0
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
✔ FAQ가 돌아오고 차단기를 비우면 평소대로 · 1.1s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 52,
"answer_ms": 1005,
"review_ms": 18,
"total_ms": 1084
}
}
Passed 4/4
report: runs/lab03-challenge2-20261024-175304.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ after: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
@@ -0,0 +1,113 @@
{
"cases": "lab03.json",
"webhook": "my-helpdesk",
"passed": 4,
"total": 4,
"results": [
{
"case": "평소",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 1.2,
"status": 200,
"request": {
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 77,
"answer_ms": 1000,
"review_ms": 16,
"total_ms": 1104
}
}
},
{
"case": "FAQ가 느릴 때 (8초)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 4.6,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
},
{
"case": "FAQ가 오류일 때 (500)",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
},
"response": {
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "breaker_open",
"llm_calls": 0
}
},
{
"case": "캐시에 있으면 FAQ가 멈춰도 답",
"webhook": "my-helpdesk",
"run": 1,
"passed": true,
"problems": [],
"seconds": 0.1,
"status": 200,
"request": {
"question": "프린터 출력이 안 돼요",
"user": "최유진"
},
"response": {
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 21
}
}
}
]
}
@@ -0,0 +1,93 @@
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
✔ 평소 · 1.2s
→ request POST /webhook/my-helpdesk
{
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
"user": "이준호",
"no_cache": true
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
"sources": [
"FAQ-003"
],
"llm_calls": 1,
"cached": false,
"steps": [
"rule",
"faq",
"ticket",
"answer",
"check"
],
"timings": {
"data_ms": 77,
"answer_ms": 1000,
"review_ms": 16,
"total_ms": 1104
}
}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ가 느릴 때 (8초) · 4.6s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "data_api_down"
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ FAQ가 오류일 때 (500) · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "한지훈",
"no_cache": true
}
← response HTTP 200
{
"route": "담당자 연결",
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
"reason": "breaker_open",
"llm_calls": 0
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 1.3s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
✔ 캐시에 있으면 FAQ가 멈춰도 답 · 0.1s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "최유진"
}
← response HTTP 200
{
"route": "자동 답변",
"category": "faq",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
"sources": [
"FAQ-004"
],
"llm_calls": 0,
"cached": true,
"steps": [
"cache"
],
"timings": {
"total_ms": 21
}
}
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
Passed 4/4
report: runs/lab03-20261024-175311.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
+13
View File
@@ -0,0 +1,13 @@
$ uv run tools/flow.py doctor
! n8n install folder /Users/mcchae/day65-n8n
→ day 65 SETUP-N8N 5단계 (get.n8n.io 설치). 다른 곳에 설치했다면 Last3Mon/65/n8n/.env 에 N8N_HOME=<폴더>
✔ n8n container day65-n8n-n8n-1
✔ n8n http://localhost:5678
✔ data API http://localhost:8800
✔ fault switch /admin/fault (day 72 data API)
✔ n8n → http://data-api:8800
✔ credential 'OpenAI (.env)' (openAiCourse0001)
✔ node catalog (for check)
✔ CLI coding agent: codex, claude, agy
ready
@@ -0,0 +1,586 @@
{
"name": "72 IT helpdesk + step timings (answer)",
"nodes": [
{
"name": "Question webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"parameters": {
"httpMethod": "POST",
"path": "my-helpdesk",
"responseMode": "responseNode",
"options": {}
},
"webhookId": "de518e93-ed19-541f-a6fc-687a4efaf1b2",
"position": [
0,
300
],
"id": "f7a423a6-a6a2-57a3-954f-e8540a1ce022"
},
{
"name": "Has question?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.body.question }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"position": [
220,
300
],
"id": "6dce76b0-2dd0-5181-99be-b0b894c87c8b"
},
{
"name": "Reject empty",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"parameters": {
"respondWith": "json",
"responseBody": "{ \"error\": \"question is required\" }",
"options": {
"responseCode": 400
}
},
"position": [
440,
560
],
"id": "75371917-2483-583e-9135-5c663a18b08b"
},
{
"name": "Start clock",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { t: Date.now() } }];"
},
"position": [
440,
300
],
"id": "34377f95-81c5-5aa3-9e2c-6b63a8e5ae54"
},
{
"name": "Classify",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "={{ $('Question webhook').first().json.body.question }}",
"options": {
"systemMessage": "You sort one company IT help-desk question. Categories: faq (how to fix or use something: password, account lock, VPN, printer, mail box, software install), ticket (asks about the status of an IT request ticket like T-1002), other (anything else). Return only JSON, no code fence: {\"category\": \"faq\"}",
"maxIterations": 1
}
},
"position": [
660,
300
],
"id": "7a93b236-dbff-52c5-9397-61087bc0688d"
},
{
"name": "Classify model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
660,
520
],
"id": "357e7611-4597-5ba3-a6ba-9a4d4d63cda7"
},
{
"name": "Parse category",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const raw = String($json.output ?? '').trim().replace(/^```(json)?\\s*|```$/g, '');\nlet category = 'other';\ntry { category = JSON.parse(raw).category ?? 'other'; } catch (error) { category = 'other'; }\nif (!['faq', 'ticket', 'other'].includes(category)) category = 'other';\nreturn [{ json: { category, by: 'llm' } }];"
},
"position": [
880,
300
],
"id": "9327634c-6764-5403-b7bc-3e666e7ae3d6"
},
{
"name": "After classify",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
1100,
300
],
"id": "8f3da4f6-ce34-5505-b543-e5d68d990a96"
},
{
"name": "Search FAQ",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "http://data-api:8800/faq",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $('Question webhook').first().json.body.question }}"
}
]
}
},
"position": [
1320,
300
],
"id": "103c6254-01ea-5e80-81bb-7e3b9ea7beb5"
},
{
"name": "After FAQ",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
1540,
300
],
"id": "d03181b0-715d-5fae-98a0-92c52a2b3b3c"
},
{
"name": "Get ticket",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "=http://data-api:8800/tickets/{{ (($('Question webhook').first().json.body.question.match(/T-?\\d{4}/i) || ['NONE'])[0]).toUpperCase().replace(/^T(\\d)/, 'T-$1') }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "requester",
"value": "={{ $('Question webhook').first().json.body.user ?? '' }}"
}
]
}
},
"position": [
1760,
300
],
"id": "f20b5c78-0224-5d55-8d77-0a9e98061a6b"
},
{
"name": "After data",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
1980,
300
],
"id": "cca89aef-ef17-5b5f-a3c3-a53e0d762b43"
},
{
"name": "Answer",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "=질문: {{ $('Question webhook').first().json.body.question }}\n분류: {{ $('Parse category').first().json.category }}\nFAQ: {{ JSON.stringify($('Search FAQ').first().json.results ?? []) }}\n접수 건: {{ JSON.stringify($('Get ticket').first().json) }}",
"options": {
"systemMessage": "You are the company IT help desk. Answer in Korean in at most 3 sentences, using only the FAQ entries and the ticket record given. Never invent steps, dates or names. For a ticket, say its status and note. If the data does not answer the question, say \"찾지 못했습니다\" and that a staff member will help.",
"maxIterations": 1
}
},
"position": [
2200,
300
],
"id": "d7ec1c62-265f-5d16-b67a-c5922305bb8a"
},
{
"name": "Answer model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
2200,
520
],
"id": "5c7f8b81-cd4c-59a2-9899-9bdb4813f7ab"
},
{
"name": "After answer",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
2420,
300
],
"id": "43dab328-4901-5fd6-8238-6e0f836cc31d"
},
{
"name": "Review",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "=초안: {{ $('Answer').first().json.output }}",
"options": {
"systemMessage": "You review a Korean IT help-desk answer before it is sent. Keep the facts exactly. Make it polite (합니다체), remove anything not supported by the data, keep at most 3 sentences. Return only the final answer text.",
"maxIterations": 1
}
},
"position": [
2640,
300
],
"id": "a4583946-f582-5ad8-963b-b866b74e9ba4"
},
{
"name": "Review model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
2640,
520
],
"id": "3be9acc9-4b3d-5a41-b6a4-00fa1b04d777"
},
{
"name": "After review",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
2860,
300
],
"id": "d07d9992-7e5e-5aab-b925-9387021bbaff"
},
{
"name": "Build result",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const ran = (name) => { try { return $(name).isExecuted; } catch (error) { return false; } };\nconst body = $('Question webhook').first().json.body;\nconst category = $('Parse category').first().json.category;\nconst answer = String($('Review').first().json.output ?? '').trim();\nconst results = $('Search FAQ').first().json.results ?? [];\nconst sources = category === 'faq' ? results.map((r) => r.id) : [];\nconst steps = [];\nif (ran('Rule classify')) steps.push('rule');\nif (ran('Classify')) steps.push('classify');\nsteps.push('faq', 'ticket', 'answer');\nsteps.push('review');\nconst llm_calls = (ran('Classify') ? 1 : 0) + 1 + 1;\nconst result = { route: '자동 답변', category, answer, sources };\nconst t = (name) => (ran(name) ? $(name).first().json.t : null);\nconst t0 = t('Start clock');\nconst marks = [['classify', t('After classify')], ['faq', t('After FAQ')], ['ticket', t('After data')], ['answer', t('After answer')], ['review', t('After review')]];\nconst timings = {};\nlet last = t0;\nfor (const [label, mark] of marks) {\n if (mark === null) continue;\n timings[`${label}_ms`] = mark - last;\n last = mark;\n}\ntimings.total_ms = Date.now() - t0;\nObject.assign(result, { llm_calls, cached: false, steps, timings });\nconst parts = Object.entries(timings).filter(([key]) => key !== 'total_ms');\nresult.slowest_step = parts.sort((a, b) => b[1] - a[1])[0][0].replace(/_ms$/, '');\nreturn [{ json: result }];"
},
"position": [
3080,
300
],
"id": "079e44f0-da3e-57dd-be6a-87025b6a320f"
},
{
"name": "Send result",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"parameters": {
"respondWith": "json",
"responseBody": "={{ $json }}",
"options": {}
},
"position": [
3300,
300
],
"id": "8ac7b99c-d9fa-5a1e-a168-33eb7ab5e2a3"
}
],
"connections": {
"Question webhook": {
"main": [
[
{
"node": "Has question?",
"type": "main",
"index": 0
}
]
]
},
"Has question?": {
"main": [
[
{
"node": "Start clock",
"type": "main",
"index": 0
}
],
[
{
"node": "Reject empty",
"type": "main",
"index": 0
}
]
]
},
"Start clock": {
"main": [
[
{
"node": "Classify",
"type": "main",
"index": 0
}
]
]
},
"Classify model": {
"ai_languageModel": [
[
{
"node": "Classify",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Classify": {
"main": [
[
{
"node": "Parse category",
"type": "main",
"index": 0
}
]
]
},
"Parse category": {
"main": [
[
{
"node": "After classify",
"type": "main",
"index": 0
}
]
]
},
"After classify": {
"main": [
[
{
"node": "Search FAQ",
"type": "main",
"index": 0
}
]
]
},
"Search FAQ": {
"main": [
[
{
"node": "After FAQ",
"type": "main",
"index": 0
}
]
]
},
"After FAQ": {
"main": [
[
{
"node": "Get ticket",
"type": "main",
"index": 0
}
]
]
},
"Get ticket": {
"main": [
[
{
"node": "After data",
"type": "main",
"index": 0
}
]
]
},
"After data": {
"main": [
[
{
"node": "Answer",
"type": "main",
"index": 0
}
]
]
},
"Answer model": {
"ai_languageModel": [
[
{
"node": "Answer",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Answer": {
"main": [
[
{
"node": "After answer",
"type": "main",
"index": 0
}
]
]
},
"After answer": {
"main": [
[
{
"node": "Review",
"type": "main",
"index": 0
}
]
]
},
"Review model": {
"ai_languageModel": [
[
{
"node": "Review",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Review": {
"main": [
[
{
"node": "After review",
"type": "main",
"index": 0
}
]
]
},
"After review": {
"main": [
[
{
"node": "Build result",
"type": "main",
"index": 0
}
]
]
},
"Build result": {
"main": [
[
{
"node": "Send result",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
@@ -0,0 +1,586 @@
{
"name": "72 IT helpdesk + time budget (answer)",
"nodes": [
{
"name": "Question webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"parameters": {
"httpMethod": "POST",
"path": "my-helpdesk",
"responseMode": "responseNode",
"options": {}
},
"webhookId": "de518e93-ed19-541f-a6fc-687a4efaf1b2",
"position": [
0,
300
],
"id": "f7a423a6-a6a2-57a3-954f-e8540a1ce022"
},
{
"name": "Has question?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.body.question }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"position": [
220,
300
],
"id": "6dce76b0-2dd0-5181-99be-b0b894c87c8b"
},
{
"name": "Reject empty",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"parameters": {
"respondWith": "json",
"responseBody": "{ \"error\": \"question is required\" }",
"options": {
"responseCode": 400
}
},
"position": [
440,
560
],
"id": "75371917-2483-583e-9135-5c663a18b08b"
},
{
"name": "Start clock",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { t: Date.now() } }];"
},
"position": [
440,
300
],
"id": "34377f95-81c5-5aa3-9e2c-6b63a8e5ae54"
},
{
"name": "Classify",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "={{ $('Question webhook').first().json.body.question }}",
"options": {
"systemMessage": "You sort one company IT help-desk question. Categories: faq (how to fix or use something: password, account lock, VPN, printer, mail box, software install), ticket (asks about the status of an IT request ticket like T-1002), other (anything else). Return only JSON, no code fence: {\"category\": \"faq\"}",
"maxIterations": 1
}
},
"position": [
660,
300
],
"id": "7a93b236-dbff-52c5-9397-61087bc0688d"
},
{
"name": "Classify model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
660,
520
],
"id": "357e7611-4597-5ba3-a6ba-9a4d4d63cda7"
},
{
"name": "Parse category",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const raw = String($json.output ?? '').trim().replace(/^```(json)?\\s*|```$/g, '');\nlet category = 'other';\ntry { category = JSON.parse(raw).category ?? 'other'; } catch (error) { category = 'other'; }\nif (!['faq', 'ticket', 'other'].includes(category)) category = 'other';\nreturn [{ json: { category, by: 'llm' } }];"
},
"position": [
880,
300
],
"id": "9327634c-6764-5403-b7bc-3e666e7ae3d6"
},
{
"name": "After classify",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
1100,
300
],
"id": "8f3da4f6-ce34-5505-b543-e5d68d990a96"
},
{
"name": "Search FAQ",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "http://data-api:8800/faq",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $('Question webhook').first().json.body.question }}"
}
]
}
},
"position": [
1320,
300
],
"id": "103c6254-01ea-5e80-81bb-7e3b9ea7beb5"
},
{
"name": "After FAQ",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
1540,
300
],
"id": "d03181b0-715d-5fae-98a0-92c52a2b3b3c"
},
{
"name": "Get ticket",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "=http://data-api:8800/tickets/{{ (($('Question webhook').first().json.body.question.match(/T-?\\d{4}/i) || ['NONE'])[0]).toUpperCase().replace(/^T(\\d)/, 'T-$1') }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "requester",
"value": "={{ $('Question webhook').first().json.body.user ?? '' }}"
}
]
}
},
"position": [
1760,
300
],
"id": "f20b5c78-0224-5d55-8d77-0a9e98061a6b"
},
{
"name": "After data",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
1980,
300
],
"id": "cca89aef-ef17-5b5f-a3c3-a53e0d762b43"
},
{
"name": "Answer",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "=질문: {{ $('Question webhook').first().json.body.question }}\n분류: {{ $('Parse category').first().json.category }}\nFAQ: {{ JSON.stringify($('Search FAQ').first().json.results ?? []) }}\n접수 건: {{ JSON.stringify($('Get ticket').first().json) }}",
"options": {
"systemMessage": "You are the company IT help desk. Answer in Korean in at most 3 sentences, using only the FAQ entries and the ticket record given. Never invent steps, dates or names. For a ticket, say its status and note. If the data does not answer the question, say \"찾지 못했습니다\" and that a staff member will help.",
"maxIterations": 1
}
},
"position": [
2200,
300
],
"id": "d7ec1c62-265f-5d16-b67a-c5922305bb8a"
},
{
"name": "Answer model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
2200,
520
],
"id": "5c7f8b81-cd4c-59a2-9899-9bdb4813f7ab"
},
{
"name": "After answer",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
2420,
300
],
"id": "43dab328-4901-5fd6-8238-6e0f836cc31d"
},
{
"name": "Review",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "=초안: {{ $('Answer').first().json.output }}",
"options": {
"systemMessage": "You review a Korean IT help-desk answer before it is sent. Keep the facts exactly. Make it polite (합니다체), remove anything not supported by the data, keep at most 3 sentences. Return only the final answer text.",
"maxIterations": 1
}
},
"position": [
2640,
300
],
"id": "a4583946-f582-5ad8-963b-b866b74e9ba4"
},
{
"name": "Review model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
2640,
520
],
"id": "3be9acc9-4b3d-5a41-b6a4-00fa1b04d777"
},
{
"name": "After review",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
2860,
300
],
"id": "d07d9992-7e5e-5aab-b925-9387021bbaff"
},
{
"name": "Build result",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const ran = (name) => { try { return $(name).isExecuted; } catch (error) { return false; } };\nconst body = $('Question webhook').first().json.body;\nconst category = $('Parse category').first().json.category;\nconst answer = String($('Review').first().json.output ?? '').trim();\nconst results = $('Search FAQ').first().json.results ?? [];\nconst sources = category === 'faq' ? results.map((r) => r.id) : [];\nconst steps = [];\nif (ran('Rule classify')) steps.push('rule');\nif (ran('Classify')) steps.push('classify');\nsteps.push('faq', 'ticket', 'answer');\nsteps.push('review');\nconst llm_calls = (ran('Classify') ? 1 : 0) + 1 + 1;\nconst result = { route: '자동 답변', category, answer, sources };\nconst t = (name) => (ran(name) ? $(name).first().json.t : null);\nconst t0 = t('Start clock');\nconst marks = [['classify', t('After classify')], ['faq', t('After FAQ')], ['ticket', t('After data')], ['answer', t('After answer')], ['review', t('After review')]];\nconst timings = {};\nlet last = t0;\nfor (const [label, mark] of marks) {\n if (mark === null) continue;\n timings[`${label}_ms`] = mark - last;\n last = mark;\n}\ntimings.total_ms = Date.now() - t0;\nObject.assign(result, { llm_calls, cached: false, steps, timings });\nconst parts = Object.entries(timings).filter(([key]) => key !== 'total_ms');\nresult.slowest_step = parts.sort((a, b) => b[1] - a[1])[0][0].replace(/_ms$/, '');\nconst budget_ms = Number(body.budget_ms ?? 3000);\nresult.llm_ms = ['classify', 'answer', 'review'].reduce((sum, label) => sum + (timings[`${label}_ms`] ?? 0), 0);\nresult.budget_ms = budget_ms;\nresult.over_budget = timings.total_ms > budget_ms;\nreturn [{ json: result }];"
},
"position": [
3080,
300
],
"id": "079e44f0-da3e-57dd-be6a-87025b6a320f"
},
{
"name": "Send result",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"parameters": {
"respondWith": "json",
"responseBody": "={{ $json }}",
"options": {}
},
"position": [
3300,
300
],
"id": "8ac7b99c-d9fa-5a1e-a168-33eb7ab5e2a3"
}
],
"connections": {
"Question webhook": {
"main": [
[
{
"node": "Has question?",
"type": "main",
"index": 0
}
]
]
},
"Has question?": {
"main": [
[
{
"node": "Start clock",
"type": "main",
"index": 0
}
],
[
{
"node": "Reject empty",
"type": "main",
"index": 0
}
]
]
},
"Start clock": {
"main": [
[
{
"node": "Classify",
"type": "main",
"index": 0
}
]
]
},
"Classify model": {
"ai_languageModel": [
[
{
"node": "Classify",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Classify": {
"main": [
[
{
"node": "Parse category",
"type": "main",
"index": 0
}
]
]
},
"Parse category": {
"main": [
[
{
"node": "After classify",
"type": "main",
"index": 0
}
]
]
},
"After classify": {
"main": [
[
{
"node": "Search FAQ",
"type": "main",
"index": 0
}
]
]
},
"Search FAQ": {
"main": [
[
{
"node": "After FAQ",
"type": "main",
"index": 0
}
]
]
},
"After FAQ": {
"main": [
[
{
"node": "Get ticket",
"type": "main",
"index": 0
}
]
]
},
"Get ticket": {
"main": [
[
{
"node": "After data",
"type": "main",
"index": 0
}
]
]
},
"After data": {
"main": [
[
{
"node": "Answer",
"type": "main",
"index": 0
}
]
]
},
"Answer model": {
"ai_languageModel": [
[
{
"node": "Answer",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Answer": {
"main": [
[
{
"node": "After answer",
"type": "main",
"index": 0
}
]
]
},
"After answer": {
"main": [
[
{
"node": "Review",
"type": "main",
"index": 0
}
]
]
},
"Review model": {
"ai_languageModel": [
[
{
"node": "Review",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Review": {
"main": [
[
{
"node": "After review",
"type": "main",
"index": 0
}
]
]
},
"After review": {
"main": [
[
{
"node": "Build result",
"type": "main",
"index": 0
}
]
]
},
"Build result": {
"main": [
[
{
"node": "Send result",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
@@ -0,0 +1,852 @@
{
"name": "72 IT helpdesk + one LLM call (answer)",
"nodes": [
{
"name": "Question webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"parameters": {
"httpMethod": "POST",
"path": "my-helpdesk",
"responseMode": "responseNode",
"options": {}
},
"webhookId": "de518e93-ed19-541f-a6fc-687a4efaf1b2",
"position": [
0,
300
],
"id": "4a893fec-ca3a-5349-a7b1-a8de0ac4350c"
},
{
"name": "Has question?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.body.question }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"position": [
220,
300
],
"id": "da287ac6-5b2c-5d11-a358-2c0d575d61ce"
},
{
"name": "Reject empty",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"parameters": {
"respondWith": "json",
"responseBody": "{ \"error\": \"question is required\" }",
"options": {
"responseCode": 400
}
},
"position": [
440,
560
],
"id": "049a20b6-3c29-5159-a0e6-f5617cf9d8d9"
},
{
"name": "Start clock",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { t: Date.now() } }];"
},
"position": [
440,
300
],
"id": "3b52fb72-af9e-54d9-8928-a1f87966b69f"
},
{
"name": "Cache key",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const body = $('Question webhook').first().json.body;\nconst key = String(body.question ?? '').trim().toLowerCase().replace(/\\s+/g, ' ');\nreturn [{ json: { ...$json, key, use_cache: body.no_cache !== true } }];"
},
"position": [
660,
300
],
"id": "1aed5faa-1a89-578c-8093-61fe2e9a2555"
},
{
"name": "Cache lookup",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "=http://data-api:8800/cache/{{ encodeURIComponent($json.key) }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
}
},
"position": [
880,
300
],
"id": "33b97251-cad7-50a2-805b-ecc7d70001de"
},
{
"name": "Cached?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.value !== undefined && $('Cache key').first().json.use_cache }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"position": [
1100,
300
],
"id": "7ad20324-27b3-5f30-9637-a4fa4d977a53"
},
{
"name": "Cached result",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const value = $json.value;\nconst t0 = $('Start clock').first().json.t;\nreturn [{ json: { route: value.route, category: value.category, answer: value.answer, sources: value.sources ?? [],\n llm_calls: 0, cached: true, steps: ['cache'], timings: { total_ms: t0 ? Date.now() - t0 : 0 } } }];"
},
"position": [
1320,
40
],
"id": "b102773a-d6b3-5fd8-9ada-e250f648cc44"
},
{
"name": "Send cached",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"parameters": {
"respondWith": "json",
"responseBody": "={{ $json }}",
"options": {}
},
"position": [
1540,
40
],
"id": "ff6ce5c6-903d-53f6-96f7-a17baabcc1b6"
},
{
"name": "Search FAQ",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "http://data-api:8800/faq",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $('Question webhook').first().json.body.question }}"
}
]
}
},
"position": [
1320,
300
],
"id": "0e3e780d-eaa1-5c13-a60a-f3112a296820"
},
{
"name": "Get ticket",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "=http://data-api:8800/tickets/{{ (($('Question webhook').first().json.body.question.match(/T-?\\d{4}/i) || ['NONE'])[0]).toUpperCase().replace(/^T(\\d)/, 'T-$1') }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "requester",
"value": "={{ $('Question webhook').first().json.body.user ?? '' }}"
}
]
}
},
"position": [
1540,
300
],
"id": "f345aacb-db55-5226-bf79-822fd2f814ca"
},
{
"name": "After data",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
1760,
300
],
"id": "4c8c6887-4a50-589b-abdf-c8741f1cf589"
},
{
"name": "Rule classify",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const question = String($('Question webhook').first().json.body.question ?? '');\nconst results = $('Search FAQ').first().json.results ?? [];\nlet category = 'unknown';\nif (/T-?\\d{4}/i.test(question)) category = 'ticket';\nelse if (results.length > 0) category = 'faq';\nreturn [{ json: { category, by: 'rule' } }];"
},
"position": [
1980,
300
],
"id": "b01cd9fc-72fc-5ace-860b-6d607bf1e570"
},
{
"name": "Known?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.category }}",
"rightValue": "unknown",
"operator": {
"type": "string",
"operation": "notEquals"
}
}
],
"combinator": "and"
},
"options": {}
},
"position": [
2200,
300
],
"id": "2d154b76-eb12-5038-a639-c5608c6bf788"
},
{
"name": "Classify",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "={{ $('Question webhook').first().json.body.question }}",
"options": {
"systemMessage": "You sort one company IT help-desk question. Categories: faq (how to fix or use something: password, account lock, VPN, printer, mail box, software install), ticket (asks about the status of an IT request ticket like T-1002), other (anything else). Return only JSON, no code fence: {\"category\": \"faq\"}",
"maxIterations": 1
}
},
"position": [
2420,
300
],
"id": "8ba05958-c916-52e4-95ef-0f38f92246c3"
},
{
"name": "Classify model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
2420,
520
],
"id": "14555336-1d5b-5860-98cc-cc7febd5fdab"
},
{
"name": "Parse category",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const raw = String($json.output ?? '').trim().replace(/^```(json)?\\s*|```$/g, '');\nlet category = 'other';\ntry { category = JSON.parse(raw).category ?? 'other'; } catch (error) { category = 'other'; }\nif (!['faq', 'ticket', 'other'].includes(category)) category = 'other';\nreturn [{ json: { category, by: 'llm' } }];"
},
"position": [
2640,
300
],
"id": "53522d0c-94f5-5e97-84ca-dfc99cbea797"
},
{
"name": "After classify",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
2860,
300
],
"id": "ed776d70-2fb9-5b97-86c8-aa43796e8cb3"
},
{
"name": "Answer",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "=질문: {{ $('Question webhook').first().json.body.question }}\n분류: {{ $json.category }}\nFAQ: {{ JSON.stringify($('Search FAQ').first().json.results ?? []) }}\n접수 건: {{ JSON.stringify($('Get ticket').first().json) }}",
"options": {
"systemMessage": "You are the company IT help desk. Answer in Korean in at most 3 sentences, using only the FAQ entries and the ticket record given. Never invent steps, dates or names. For a ticket, say its status and note. If the data does not answer the question, say \"찾지 못했습니다\" and that a staff member will help.",
"maxIterations": 1
}
},
"position": [
3080,
300
],
"id": "3cd227a5-1bb5-50e6-9402-69206c7ca546"
},
{
"name": "Answer model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
3080,
520
],
"id": "f3dad63e-7b9c-5d29-b79e-077754d581b7"
},
{
"name": "After answer",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
3300,
300
],
"id": "0432c08a-5b0d-5d75-8e06-eab20db15ab1"
},
{
"name": "Review check",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "let answer = String($('Answer').first().json.output ?? '').trim();\nconst problems = [];\nif (!answer) problems.push('empty');\nif (!/[가-힣]/.test(answer)) problems.push('not_korean');\nif (answer.length > 400) { answer = answer.slice(0, 400); problems.push('too_long'); }\nreturn [{ json: { ...$json, answer, review_problems: problems } }];"
},
"position": [
3520,
300
],
"id": "c2d5b0e4-e7e1-5972-8b49-d2aa51694714"
},
{
"name": "After review",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
},
"position": [
3740,
300
],
"id": "f031c87a-b44b-55fa-a122-05d93f51fa6e"
},
{
"name": "Build result",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const ran = (name) => { try { return $(name).isExecuted; } catch (error) { return false; } };\nconst body = $('Question webhook').first().json.body;\nconst category = $('Parse category').isExecuted ? $('Parse category').first().json.category : $('Rule classify').first().json.category;\nconst answer = $('Review check').first().json.answer;\nconst results = $('Search FAQ').first().json.results ?? [];\nconst sources = category === 'faq' ? results.map((r) => r.id) : [];\nconst steps = [];\nif (ran('Rule classify')) steps.push('rule');\nif (ran('Classify')) steps.push('classify');\nsteps.push('faq', 'ticket', 'answer');\nsteps.push('check');\nconst llm_calls = (ran('Classify') ? 1 : 0) + 1 + 0;\nconst result = { route: '자동 답변', category, answer, sources };\nconst t = (name) => (ran(name) ? $(name).first().json.t : null);\nconst t0 = t('Start clock');\nconst marks = [['data', t('After data')], ['classify', t('After classify')], ['answer', t('After answer')], ['review', t('After review')]];\nconst timings = {};\nlet last = t0;\nfor (const [label, mark] of marks) {\n if (mark === null) continue;\n timings[`${label}_ms`] = mark - last;\n last = mark;\n}\ntimings.total_ms = Date.now() - t0;\nObject.assign(result, { llm_calls, cached: false, steps, timings });\nreturn [{ json: result }];"
},
"position": [
3960,
300
],
"id": "fc92aa99-281c-5e7a-96fb-6868624c4f34"
},
{
"name": "Cache it?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.category === 'faq' && $('Cache key').first().json.use_cache }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"position": [
4180,
300
],
"id": "f14260a7-8d0f-5916-a219-c233bc484860"
},
{
"name": "Store in cache",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "=http://data-api:8800/cache/{{ encodeURIComponent($('Cache key').first().json.key) }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"method": "POST",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({ value: { route: $json.route, category: $json.category, answer: $json.answer, sources: $json.sources }, ttl: 600 }) }}"
},
"position": [
4400,
180
],
"id": "8c73289d-f4b4-50c2-a71e-229d368e7b39"
},
{
"name": "Result again",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: $('Build result').first().json }];"
},
"position": [
4620,
180
],
"id": "4033230f-4e3a-515a-a980-ed987bc3372e"
},
{
"name": "Send result",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"parameters": {
"respondWith": "json",
"responseBody": "={{ $json }}",
"options": {}
},
"position": [
4840,
300
],
"id": "43408f1e-819c-54ef-bb7b-7039f738e6f1"
}
],
"connections": {
"Question webhook": {
"main": [
[
{
"node": "Has question?",
"type": "main",
"index": 0
}
]
]
},
"Has question?": {
"main": [
[
{
"node": "Start clock",
"type": "main",
"index": 0
}
],
[
{
"node": "Reject empty",
"type": "main",
"index": 0
}
]
]
},
"Start clock": {
"main": [
[
{
"node": "Cache key",
"type": "main",
"index": 0
}
]
]
},
"Cache key": {
"main": [
[
{
"node": "Cache lookup",
"type": "main",
"index": 0
}
]
]
},
"Cache lookup": {
"main": [
[
{
"node": "Cached?",
"type": "main",
"index": 0
}
]
]
},
"Cached?": {
"main": [
[
{
"node": "Cached result",
"type": "main",
"index": 0
}
],
[
{
"node": "Search FAQ",
"type": "main",
"index": 0
}
]
]
},
"Cached result": {
"main": [
[
{
"node": "Send cached",
"type": "main",
"index": 0
}
]
]
},
"Search FAQ": {
"main": [
[
{
"node": "Get ticket",
"type": "main",
"index": 0
}
]
]
},
"Get ticket": {
"main": [
[
{
"node": "After data",
"type": "main",
"index": 0
}
]
]
},
"After data": {
"main": [
[
{
"node": "Rule classify",
"type": "main",
"index": 0
}
]
]
},
"Rule classify": {
"main": [
[
{
"node": "Known?",
"type": "main",
"index": 0
}
]
]
},
"Known?": {
"main": [
[
{
"node": "Answer",
"type": "main",
"index": 0
}
],
[
{
"node": "Classify",
"type": "main",
"index": 0
}
]
]
},
"Classify model": {
"ai_languageModel": [
[
{
"node": "Classify",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Classify": {
"main": [
[
{
"node": "Parse category",
"type": "main",
"index": 0
}
]
]
},
"Parse category": {
"main": [
[
{
"node": "After classify",
"type": "main",
"index": 0
}
]
]
},
"After classify": {
"main": [
[
{
"node": "Answer",
"type": "main",
"index": 0
}
]
]
},
"Answer model": {
"ai_languageModel": [
[
{
"node": "Answer",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Answer": {
"main": [
[
{
"node": "After answer",
"type": "main",
"index": 0
}
]
]
},
"After answer": {
"main": [
[
{
"node": "Review check",
"type": "main",
"index": 0
}
]
]
},
"Review check": {
"main": [
[
{
"node": "After review",
"type": "main",
"index": 0
}
]
]
},
"After review": {
"main": [
[
{
"node": "Build result",
"type": "main",
"index": 0
}
]
]
},
"Build result": {
"main": [
[
{
"node": "Cache it?",
"type": "main",
"index": 0
}
]
]
},
"Cache it?": {
"main": [
[
{
"node": "Store in cache",
"type": "main",
"index": 0
}
],
[
{
"node": "Send result",
"type": "main",
"index": 0
}
]
]
},
"Store in cache": {
"main": [
[
{
"node": "Result again",
"type": "main",
"index": 0
}
]
]
},
"Result again": {
"main": [
[
{
"node": "Send result",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,238 @@
{
"name": "72 Health check (answer)",
"nodes": [
{
"name": "Health webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"parameters": {
"httpMethod": "POST",
"path": "my-health",
"responseMode": "responseNode",
"options": {}
},
"webhookId": "bdf5dd1e-edb4-503e-b800-c8653ff5fbb4",
"position": [
0,
300
],
"id": "cd5b6b9d-06a3-57ed-91ab-0ab44b344fde"
},
{
"name": "Start",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "return [{ json: { t0: Date.now() } }];"
},
"position": [
220,
300
],
"id": "0445c332-e249-5cce-915d-fca703b570b8"
},
{
"name": "Check data API",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "http://data-api:8800/health",
"options": {
"timeout": 2000
}
},
"onError": "continueRegularOutput",
"alwaysOutputData": true,
"position": [
440,
300
],
"id": "8ce80344-ec8e-5bd5-9a2e-839d49d9f1e9"
},
{
"name": "Check FAQ",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"parameters": {
"url": "http://data-api:8800/faq",
"options": {
"timeout": 2000
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "vpn"
}
]
}
},
"onError": "continueRegularOutput",
"alwaysOutputData": true,
"position": [
660,
300
],
"id": "a935db0a-fc45-5a01-aa52-405740f82e9f"
},
{
"name": "Check LLM",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"parameters": {
"promptType": "define",
"text": "Reply with the single word OK.",
"options": {
"systemMessage": "You are a health check. Reply with OK only.",
"maxIterations": 1
}
},
"onError": "continueRegularOutput",
"alwaysOutputData": true,
"position": [
880,
300
],
"id": "96a58520-65ae-548a-ac2f-0b41d004933f"
},
{
"name": "Health model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4.1-mini"
},
"options": {
"temperature": 0,
"timeout": 8000,
"maxRetries": 0
}
},
"credentials": {
"openAiApi": {
"id": "openAiCourse0001",
"name": "OpenAI (.env)"
}
},
"position": [
880,
520
],
"id": "5aa10812-b13e-5bae-831e-7ccd24e72e62"
},
{
"name": "Summarize",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"parameters": {
"jsCode": "const data_api = $('Check data API').first().json.status === 'ok';\nconst faq = Array.isArray($('Check FAQ').first().json.results);\nconst llm = /ok/i.test(String($('Check LLM').first().json.output ?? ''));\nconst checks = { data_api, faq, llm };\nconst failed = Object.entries(checks).filter(([, good]) => !good).map(([name]) => name);\nconst status = failed.length === 0 ? 'ok' : (data_api || llm ? 'degraded' : 'down');\nreturn [{ json: { status, checks, failed, seconds: Math.round((Date.now() - $('Start').first().json.t0) / 100) / 10 } }];"
},
"position": [
1100,
300
],
"id": "54ee87ba-881d-5ad1-a032-1262876fdd48"
},
{
"name": "Send status",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"parameters": {
"respondWith": "json",
"responseBody": "={{ $json }}",
"options": {}
},
"position": [
1320,
300
],
"id": "2340a4f9-d3c9-5717-ad49-b782bcd9f808"
}
],
"connections": {
"Health model": {
"ai_languageModel": [
[
{
"node": "Check LLM",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Health webhook": {
"main": [
[
{
"node": "Start",
"type": "main",
"index": 0
}
]
]
},
"Start": {
"main": [
[
{
"node": "Check data API",
"type": "main",
"index": 0
}
]
]
},
"Check data API": {
"main": [
[
{
"node": "Check FAQ",
"type": "main",
"index": 0
}
]
]
},
"Check FAQ": {
"main": [
[
{
"node": "Check LLM",
"type": "main",
"index": 0
}
]
]
},
"Check LLM": {
"main": [
[
{
"node": "Summarize",
"type": "main",
"index": 0
}
]
]
},
"Summarize": {
"main": [
[
{
"node": "Send status",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff