Files
aio-01d4-stu/Last3Mon/77/answers/18-lab03-fix.txt
T

406 lines
12 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
$ uv run tools/flow.py push reference/lab03-example1-helpdesk-fixed.json
! unpublished '77 Live helpdesk (provided)' (wb754efbe6b67af7): it used the same webhook path
✔ pushed '77 Live helpdesk fixed (reference)' (id wc5ae6e8bcdf8e39)
POST http://localhost:5678/webhook/my-helpdesk
$ curl -s -XPOST localhost:8800/faq/add -H 'Content-Type: application/json' -d @requests/faq-wifi.json
{"added": "FAQ-007", "size": 7}
$ uv run tools/flow.py test cases/replay-after.json -v
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "prompts": "ok", "usage": "ok", "dlq": "ok", "slow_seconds": 1.2}
→ request POST http://localhost:8800/admin/fault
{
"faq": "slow",
"slow_seconds": 1.2
}
← response HTTP 200
{
"faq": "slow",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok",
"slow_seconds": 1.2
}
POST http://localhost:5678/webhook/my-helpdesk · 10 case(s) × 1
✔ after · 회의실 와이파이가 안 · 4.5s
→ request POST /webhook/my-helpdesk
{
"question": "회의실 와이파이가 안 잡혀요",
"user": "이준호",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "와이파이",
"answer": "회의실에서 와이파이가 잡히지 않으면 가까운 공유기 번호를 IT 포털에 신고해 주세요. 사내 와이파이는 'CORP-WIFI'에 사번으로 로그인합니다.",
"error": null
}
✔ after · 사내 Wi-Fi 비밀번 · 2.4s
→ request POST /webhook/my-helpdesk
{
"question": "사내 Wi-Fi 비밀번호가 뭐예요?",
"user": "박서연",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "와이파이",
"answer": "사내 와이파이는 'CORP-WIFI'에 사번으로 로그인합니다. 비밀번호는 별도로 없으며, 사번으로 인증합니다. 회의실에서 연결이 안 되면 가까운 공유기 번호를 IT 포털에 신고해 주세요.",
"error": null
}
✔ after · 와이파이가 자주 끊겨요 · 2.4s
→ request POST /webhook/my-helpdesk
{
"question": "와이파이가 자주 끊겨요",
"user": "최유진",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "와이파이",
"answer": "사내 와이파이는 'CORP-WIFI'에 사번으로 로그인합니다. 회의실 등 특정 장소에서 와이파이가 자주 끊기면 가까운 공유기 번호를 IT 포털에 신고해 주세요.",
"error": null
}
✔ after · 노트북이 와이파이에 연 · 2.3s
→ request POST /webhook/my-helpdesk
{
"question": "노트북이 와이파이에 연결이 안 돼요",
"user": "한지훈",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "와이파이",
"answer": "사내 와이파이는 'CORP-WIFI'에 사번으로 로그인합니다. 회의실에서 와이파이가 잡히지 않으면 가까운 공유기 번호를 IT 포털에 신고해 주세요.",
"error": null
}
✔ after · 손님용 wifi도 있나 · 2.9s
→ request POST /webhook/my-helpdesk
{
"question": "손님용 wifi도 있나요?",
"user": "김민지",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "와이파이",
"answer": "손님용 와이파이에 대한 안내는 제공되지 않습니다. 사내 와이파이는 'CORP-WIFI'에 사번으로 로그인하여 사용합니다. 추가 문의 사항은 IT 포털에 문의해 주세요.",
"error": null
}
✔ after · VPN이 자꾸 끊겨요 · 2.4s
→ request POST /webhook/my-helpdesk
{
"question": "VPN이 자꾸 끊겨요",
"user": "정우성",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "VPN",
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다.",
"error": null
}
✔ after · 비밀번호를 잊어버렸어요 · 2.3s
→ request POST /webhook/my-helpdesk
{
"question": "비밀번호를 잊어버렸어요",
"user": "오세훈",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "비밀번호",
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정합니다.",
"error": null
}
✔ after · 프린터 출력이 안 돼요 · 2.3s
→ request POST /webhook/my-helpdesk
{
"question": "프린터 출력이 안 돼요",
"user": "윤하늘",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "프린터",
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력합니다.",
"error": null
}
✔ after · 메일함 용량이 꽉 찼대 · 2.6s
→ request POST /webhook/my-helpdesk
{
"question": "메일함 용량이 꽉 찼대요",
"user": "강민수",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "메일",
"answer": "오래된 메일과 큰 첨부 파일을 보관함으로 옮기거나 삭제해 용량을 확보합니다.",
"error": null
}
✔ after · 새 프로그램 설치는 어 · 2.4s
→ request POST /webhook/my-helpdesk
{
"question": "새 프로그램 설치는 어떻게 신청하나요?",
"user": "서지아",
"tag": "after"
}
← response HTTP 200
{
"route": "자동 답변",
"status": "success",
"topic": "설치",
"answer": "새 프로그램 설치는 IT 포털의 '소프트웨어 신청' 메뉴에서 승인 요청을 올리면 승인 후 원격으로 설치됩니다.",
"error": null
}
Passed 10/10
report: runs/replay-after-20261031-075158.json
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "prompts": "ok", "usage": "ok", "dlq": "ok", "slow_seconds": 1.2}
→ request POST http://localhost:8800/admin/fault
{
"faq": "ok",
"tickets": "ok"
}
← response HTTP 200
{
"faq": "ok",
"tickets": "ok",
"prompts": "ok",
"usage": "ok",
"dlq": "ok",
"slow_seconds": 1.2
}
$ uv run tools/flow.py test cases/lab03.json -v
POST http://localhost:5678/webhook/my-log-report · 4 case(s) × 1
✔ 고치기 전 · 10건 모두 실패 · 0.1s · 0 calls · $0.000000
→ request POST /webhook/my-log-report
{
"tag": "before",
"source": "live"
}
← response HTTP 200
{
"total": 10,
"errors": 10,
"error_rate": 1,
"p50_ms": 1043,
"p95_ms": 1098,
"by_route": {
"오류": 10
},
"by_day": {
"2026-10-31": {
"total": 10,
"errors": 10,
"error_rate": 1
}
},
"by_release": {},
"steps": {
"faq_ms": {
"runs": 10,
"p50": 1043,
"p95": 1098
},
"answer_ms": {
"runs": 0,
"p50": 0,
"p95": 0
}
},
"cost_usd": 0,
"cost_per_run": 0,
"llm_calls": 0,
"failures": [
{
"node": "Search FAQ",
"message": "timeout of 1000ms exceeded",
"count": 10
}
],
"unanswered_topics": [],
"anomalies": [],
"repeat_topics": []
}
✔ 고치기 전 · FAQ timeout · 0.1s · 0 calls · $0.000000
→ request POST /webhook/my-log-report
{
"tag": "before",
"source": "live"
}
← response HTTP 200
{
"total": 10,
"errors": 10,
"error_rate": 1,
"p50_ms": 1043,
"p95_ms": 1098,
"by_route": {
"오류": 10
},
"by_day": {
"2026-10-31": {
"total": 10,
"errors": 10,
"error_rate": 1
}
},
"by_release": {},
"steps": {
"faq_ms": {
"runs": 10,
"p50": 1043,
"p95": 1098
},
"answer_ms": {
"runs": 0,
"p50": 0,
"p95": 0
}
},
"cost_usd": 0,
"cost_per_run": 0,
"llm_calls": 0,
"failures": [
{
"node": "Search FAQ",
"message": "timeout of 1000ms exceeded",
"count": 10
}
],
"unanswered_topics": [],
"anomalies": [],
"repeat_topics": []
}
✔ 고친 뒤 · 오류 없음 · 0.1s · 10 calls · $0.000000
→ request POST /webhook/my-log-report
{
"tag": "after",
"source": "live"
}
← response HTTP 200
{
"total": 10,
"errors": 0,
"error_rate": 0,
"p50_ms": 2342,
"p95_ms": 3560,
"by_route": {
"자동 답변": 10
},
"by_day": {
"2026-10-31": {
"total": 10,
"errors": 0,
"error_rate": 0
}
},
"by_release": {
"1.1.0": {
"answers": 10,
"repeats": 0,
"repeat_rate": 0
}
},
"steps": {
"faq_ms": {
"runs": 10,
"p50": 1238,
"p95": 1278
},
"answer_ms": {
"runs": 10,
"p50": 1103,
"p95": 2282
}
},
"cost_usd": 0,
"cost_per_run": 0,
"llm_calls": 10,
"failures": [],
"unanswered_topics": [],
"anomalies": [],
"repeat_topics": []
}
✔ 고친 뒤 · 답하지 못한 주제 없음 · 0.0s · 10 calls · $0.000000
→ request POST /webhook/my-log-report
{
"tag": "after",
"source": "live"
}
← response HTTP 200
{
"total": 10,
"errors": 0,
"error_rate": 0,
"p50_ms": 2342,
"p95_ms": 3560,
"by_route": {
"자동 답변": 10
},
"by_day": {
"2026-10-31": {
"total": 10,
"errors": 0,
"error_rate": 0
}
},
"by_release": {
"1.1.0": {
"answers": 10,
"repeats": 0,
"repeat_rate": 0
}
},
"steps": {
"faq_ms": {
"runs": 10,
"p50": 1238,
"p95": 1278
},
"answer_ms": {
"runs": 10,
"p50": 1103,
"p95": 2282
}
},
"cost_usd": 0,
"cost_per_run": 0,
"llm_calls": 10,
"failures": [],
"unanswered_topics": [],
"anomalies": [],
"repeat_topics": []
}
Passed 4/4
report: runs/lab03-20261031-075159.json
$ uv run tools/flow.py ops
fault switch: all ok
live run logs: 20 (tag before 10 · tag after 10)
added FAQ: 1 (FAQ-007)
created tickets: 0
DLQ: 0 (parked 0)
alerts: 0