75일차 자료 추가 (답 제외): 실습 15개 · 실행 결과, gpt-5.4-nano · 단가, 교안 개요 30장 · 4단계 정리, 바이브 코딩 tcost 요청서

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mcchaeandClaude Opus 5.5 committed 2026-10-28 22:38:01 +09:00
1 parent d663d045e3
commit 01dc892303
70 files changed
+10890

No files matched your search

+72
View File
@@ -0,0 +1,72 @@
{
"webhook": "my-cost",
"before": [
{
"url": "http://localhost:8800/usage-clear",
"body": {}
}
],
"cases": [
{
"name": "기록 1 · VPN",
"request": "requests/faq-vpn.json",
"expect": {
"contains": {
"answer": [
"인증서"
]
}
}
},
{
"name": "기록 2 · 접수",
"request": "requests/ticket-own.json",
"expect": {
"contains": {
"answer": [
"처리 중",
"대기 중"
]
}
}
},
{
"name": "기록 3 · 다른 사람",
"request": "requests/faq-password.json",
"expect": {
"contains": {
"answer": [
"비밀번호 찾기",
"휴대폰"
]
}
}
},
{
"name": "사용량 요약 · 요청 3건",
"url": "http://localhost:8800/usage/summary",
"body": {},
"expect": {
"equals": {
"requests": 3
},
"range": {
"cost_usd": [
1e-06,
0.05
]
},
"contains": {
"by_user": [
"이준호",
"박서연",
"한지훈"
],
"by_model": [
"gpt-4.1-mini"
]
}
}
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"webhook": "my-cost",
"before": [
{
"url": "http://localhost:8800/usage-clear",
"body": {}
},
{
"url": "http://localhost:8800/admin/fault",
"body": {
"usage": "ok"
}
}
],
"after": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"usage": "ok"
}
}
],
"cases": [
{
"name": "기록 API 고장(500) · 답은 나감",
"request": "requests/faq-vpn.json",
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"usage": "error"
}
}
],
"expect": {
"equals": {
"recorded": false
},
"contains": {
"answer": [
"인증서"
]
}
}
},
{
"name": "기록 API 느림(8초) · 답은 나감",
"request": "requests/faq-printer.json",
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"usage": "slow",
"slow_seconds": 8
}
}
],
"expect": {
"equals": {
"recorded": false
},
"contains": {
"answer": [
"대기열"
]
},
"max_seconds": 15
}
},
{
"name": "고친 뒤 · 기록됨",
"request": "requests/faq-password.json",
"before": [
{
"url": "http://localhost:8800/admin/fault",
"body": {
"usage": "ok"
}
}
],
"expect": {
"equals": {
"recorded": true
},
"contains": {
"answer": [
"비밀번호 찾기",
"휴대폰"
]
}
}
},
{
"name": "요약 · 기록된 요청은 1건",
"url": "http://localhost:8800/usage/summary",
"body": {},
"expect": {
"equals": {
"requests": 1
}
}
}
]
}
+54
View File
@@ -0,0 +1,54 @@
{
"webhook": "my-cost",
"cases": [
{
"name": "FAQ · VPN",
"request": "requests/faq-vpn.json",
"expect": {
"status": 200
}
},
{
"name": "FAQ · 프린터",
"request": "requests/faq-printer.json",
"expect": {
"status": 200
}
},
{
"name": "FAQ · 비밀번호",
"request": "requests/faq-password.json",
"expect": {
"status": 200
}
},
{
"name": "FAQ · 메일",
"request": "requests/faq-mail.json",
"expect": {
"status": 200
}
},
{
"name": "접수 · T-1002",
"request": "requests/ticket-own.json",
"expect": {
"status": 200
}
},
{
"name": "접수 · T-1001",
"request": "requests/ticket-done.json",
"expect": {
"status": 200
}
},
{
"name": "규칙에 없는 질문",
"request": "requests/no-keyword.json",
"expect": {
"status": 200
}
}
]
}
+55
View File
@@ -0,0 +1,55 @@
{
"webhook": "my-cost",
"cases": [
{
"name": "VPN · 비용과 단계별 사용량",
"request": "requests/faq-vpn.json",
"expect": {
"range": {
"cost_usd": [
1e-06,
0.01
],
"usage.prompt_tokens": [
1,
20000
],
"usage.by_step.answer.cost_usd": [
1e-06,
0.01
]
},
"contains": {
"answer": [
"인증서"
]
}
}
},
{
"name": "접수 현황 · 비용",
"request": "requests/ticket-own.json",
"expect": {
"range": {
"cost_usd": [
1e-06,
0.01
]
},
"contains": {
"answer": [
"처리 중",
"대기 중"
]
}
}
},
{
"name": "빈 질문은 LLM 없이",
"request": "requests/empty-question.json",
"expect": {
"status": 400
}
}
]
}
+139
View File
@@ -0,0 +1,139 @@
{
"webhook": "my-cost",
"cases": [
{
"name": "faq-vpn · LLM 한 번 · $0.0002 이하",
"request": "requests/faq-vpn.json",
"expect": {
"equals": {
"llm_calls": 1
},
"range": {
"cost_usd": [
1e-06,
0.0002
]
},
"contains": {
"answer": [
"인증서"
]
}
}
},
{
"name": "faq-password · LLM 한 번 · $0.0002 이하",
"request": "requests/faq-password.json",
"expect": {
"equals": {
"llm_calls": 1
},
"range": {
"cost_usd": [
1e-06,
0.0002
]
},
"contains": {
"answer": [
"비밀번호 찾기",
"휴대폰"
]
}
}
},
{
"name": "faq-printer · LLM 한 번 · $0.0002 이하",
"request": "requests/faq-printer.json",
"expect": {
"equals": {
"llm_calls": 1
},
"range": {
"cost_usd": [
1e-06,
0.0002
]
},
"contains": {
"answer": [
"대기열",
"전원"
]
}
}
},
{
"name": "faq-mail · LLM 한 번 · $0.0002 이하",
"request": "requests/faq-mail.json",
"expect": {
"equals": {
"llm_calls": 1
},
"range": {
"cost_usd": [
1e-06,
0.0002
]
},
"contains": {
"answer": [
"보관함",
"삭제"
]
}
}
},
{
"name": "ticket-own · LLM 한 번 · $0.0002 이하",
"request": "requests/ticket-own.json",
"expect": {
"equals": {
"llm_calls": 1
},
"range": {
"cost_usd": [
1e-06,
0.0002
]
},
"contains": {
"answer": [
"처리 중",
"대기 중"
]
}
}
},
{
"name": "ticket-done · LLM 한 번 · $0.0002 이하",
"request": "requests/ticket-done.json",
"expect": {
"equals": {
"llm_calls": 1
},
"range": {
"cost_usd": [
1e-06,
0.0002
]
},
"contains": {
"answer": [
"처리 완료",
"완료"
]
}
}
},
{
"name": "규칙으로 모르는 질문은 분류 + 답",
"request": "requests/no-keyword.json",
"expect": {
"equals": {
"llm_calls": 2
}
}
}
]
}
+96
View File
@@ -0,0 +1,96 @@
{
"webhook": "my-cost",
"before": [
{
"url": "http://localhost:8800/budget/reset",
"body": {}
}
],
"after": [
{
"url": "http://localhost:8800/budget/reset",
"body": {}
}
],
"cases": [
{
"name": "긴 로그 + 끝에 질문 · 프린터",
"request": "requests/long-printer.json",
"expect": {
"equals": {
"llm_calls": 1,
"trimmed": true
},
"range": {
"cost_usd": [
1e-06,
0.0003
]
},
"contains": {
"answer": [
"대기열"
]
}
}
},
{
"name": "앞에 질문 + 긴 로그 · VPN",
"request": "requests/long-vpn.json",
"expect": {
"equals": {
"llm_calls": 1,
"trimmed": true
},
"range": {
"cost_usd": [
1e-06,
0.0003
]
},
"contains": {
"answer": [
"인증서"
]
}
}
},
{
"name": "짧은 질문은 그대로",
"request": "requests/faq-vpn.json",
"expect": {
"equals": {
"trimmed": false,
"question_chars": 24
},
"contains": {
"answer": [
"인증서"
]
}
}
},
{
"name": "사람이 한도를 늘리면 자르지 않음",
"request": "requests/long-printer.json",
"before": [
{
"url": "http://localhost:8800/budget",
"body": {
"max_question_chars": 10000
}
}
],
"expect": {
"equals": {
"trimmed": false
},
"contains": {
"answer": [
"대기열"
]
}
}
}
]
}
+72
View File
@@ -0,0 +1,72 @@
{
"webhook": "my-cost",
"cases": [
{
"name": "예제 1 · VPN · 보내는 양 줄이기",
"request": "requests/faq-vpn.json",
"expect": {
"range": {
"usage.by_step.answer.prompt_tokens": [
1,
600
]
},
"contains": {
"answer": [
"인증서"
]
}
}
},
{
"name": "예제 1 · 접수 · 보내는 양 줄이기",
"request": "requests/ticket-own.json",
"expect": {
"range": {
"usage.by_step.answer.prompt_tokens": [
1,
600
]
},
"contains": {
"answer": [
"처리 중",
"대기 중"
]
}
}
},
{
"name": "예제 1 · 비밀번호 · 품질 그대로",
"request": "requests/faq-password.json",
"expect": {
"contains": {
"answer": [
"비밀번호 찾기",
"휴대폰"
]
}
}
},
{
"name": "예제 2 · 분류는 작은 모델",
"request": "requests/no-keyword.json",
"expect": {
"equals": {
"usage.by_step.classify.model": "gpt-5.4-nano"
}
}
},
{
"name": "예제 2 · 프린터 · 품질 그대로",
"request": "requests/faq-printer.json",
"expect": {
"contains": {
"answer": [
"대기열"
]
}
}
}
]
}
+144
View File
@@ -0,0 +1,144 @@
{
"webhook": "my-cost-report",
"before": [
{
"url": "http://localhost:8800/usage-clear",
"body": {}
},
{
"url": "http://localhost:8800/budget/reset",
"body": {}
},
{
"url": "http://localhost:8800/usage",
"body": {
"items": [
{
"request_id": "r1",
"user": "이준호",
"step": "answer",
"model": "gpt-4.1-mini",
"prompt_tokens": 1000,
"completion_tokens": 100,
"cost_usd": 0.00056,
"route": "자동 답변"
},
{
"request_id": "r1",
"user": "이준호",
"step": "classify",
"model": "gpt-5.4-nano",
"prompt_tokens": 100,
"completion_tokens": 20,
"cost_usd": 4.5e-05,
"route": "자동 답변"
},
{
"request_id": "r2",
"user": "박서연",
"step": "answer",
"model": "gpt-4.1-mini",
"prompt_tokens": 2000,
"completion_tokens": 200,
"cost_usd": 0.00112,
"route": "자동 답변"
},
{
"request_id": "r3",
"user": "이준호",
"step": "answer",
"model": "gpt-4.1-mini",
"prompt_tokens": 500,
"completion_tokens": 40,
"cost_usd": 0.000264,
"route": "자동 답변"
}
]
}
}
],
"after": [
{
"url": "http://localhost:8800/budget/reset",
"body": {}
},
{
"url": "http://localhost:8800/usage-clear",
"body": {}
}
],
"cases": [
{
"name": "요약 숫자",
"body": {
"requests_per_day": 100,
"workdays": 22
},
"expect": {
"equals": {
"requests": 3,
"calls": 4,
"cost_usd": 0.001989,
"avg_usd": 0.000663,
"top_user": "박서연"
}
}
},
{
"name": "모델별 · 한 달 예상",
"body": {
"requests_per_day": 100,
"workdays": 22
},
"expect": {
"equals": {
"projected_month_usd": 1.4586
},
"contains": {
"by_model": [
"\"gpt-4.1-mini\": 0.001944"
]
}
}
},
{
"name": "작은 모델 몫",
"body": {},
"expect": {
"contains": {
"by_model": [
"\"gpt-5.4-nano\": 4.5e-05"
]
}
}
},
{
"name": "예산 남은 금액",
"body": {},
"expect": {
"equals": {
"daily_budget_usd": 1.0,
"remaining_usd": 0.998011,
"over_budget": false
}
}
},
{
"name": "예산을 넘으면",
"body": {},
"before": [
{
"url": "http://localhost:8800/budget",
"body": {
"daily_usd": 0.001
}
}
],
"expect": {
"equals": {
"over_budget": true
}
}
}
]
}
+141
View File
@@ -0,0 +1,141 @@
{
"webhook": "my-cost-report",
"before": [
{
"url": "http://localhost:8800/usage-clear",
"body": {}
},
{
"url": "http://localhost:8800/budget/reset",
"body": {}
},
{
"url": "http://localhost:8800/usage",
"body": {
"items": [
{
"request_id": "r1",
"user": "이준호",
"step": "answer",
"model": "gpt-4.1-mini",
"prompt_tokens": 1000,
"completion_tokens": 100,
"cost_usd": 0.00056,
"route": "자동 답변"
},
{
"request_id": "r1",
"user": "이준호",
"step": "classify",
"model": "gpt-5.4-nano",
"prompt_tokens": 100,
"completion_tokens": 20,
"cost_usd": 4.5e-05,
"route": "자동 답변"
},
{
"request_id": "r2",
"user": "박서연",
"step": "answer",
"model": "gpt-4.1-mini",
"prompt_tokens": 2000,
"completion_tokens": 200,
"cost_usd": 0.00112,
"route": "자동 답변"
},
{
"request_id": "r3",
"user": "이준호",
"step": "answer",
"model": "gpt-4.1-mini",
"prompt_tokens": 500,
"completion_tokens": 40,
"cost_usd": 0.000264,
"route": "자동 답변"
}
]
}
}
],
"after": [
{
"url": "http://localhost:8800/budget/reset",
"body": {}
},
{
"url": "http://localhost:8800/usage-clear",
"body": {}
}
],
"cases": [
{
"name": "모두 nano였다면",
"body": {
"requests_per_day": 100,
"workdays": 22,
"what_if_model": "gpt-5.4-nano"
},
"expect": {
"equals": {
"what_if.model": "gpt-5.4-nano",
"what_if.cost_usd": 0.00117,
"what_if.saving_usd": 0.000819,
"what_if.projected_month_usd": 0.858
}
}
},
{
"name": "원래 숫자는 그대로",
"body": {
"requests_per_day": 100,
"workdays": 22,
"what_if_model": "gpt-5.4-nano"
},
"expect": {
"equals": {
"cost_usd": 0.001989,
"projected_month_usd": 1.4586
}
}
},
{
"name": "모두 mini였다면 · 아끼는 돈이 음수",
"body": {
"what_if_model": "gpt-4.1-mini"
},
"expect": {
"equals": {
"what_if.cost_usd": 0.002016,
"what_if.saving_usd": -2.7e-05
}
}
},
{
"name": "없는 모델은 400",
"body": {
"what_if_model": "gpt-9"
},
"expect": {
"status": 400,
"equals": {
"error": "unknown model"
},
"contains": {
"known": [
"gpt-5.4-nano"
]
}
}
},
{
"name": "what_if 없이 부르면 과제 1과 같음",
"body": {},
"expect": {
"equals": {
"what_if": null,
"requests": 3
}
}
}
]
}
+53
View File
@@ -0,0 +1,53 @@
{
"webhook": "my-cost",
"before": [
{
"url": "http://localhost:8800/usage-clear",
"body": {}
}
],
"cases": [
{
"name": "1번째 · VPN",
"request": "requests/faq-vpn.json",
"expect": {
"status": 200
}
},
{
"name": "2번째 · 프린터",
"request": "requests/faq-printer.json",
"expect": {
"status": 200
}
},
{
"name": "3번째 · 비밀번호",
"request": "requests/faq-password.json",
"expect": {
"status": 200
}
},
{
"name": "4번째 · 메일",
"request": "requests/faq-mail.json",
"expect": {
"status": 200
}
},
{
"name": "5번째 · 접수",
"request": "requests/ticket-own.json",
"expect": {
"status": 200
}
},
{
"name": "6번째 · VPN 다시",
"request": "requests/faq-vpn.json",
"expect": {
"status": 200
}
}
]
}
+67
View File
@@ -0,0 +1,67 @@
{
"webhook": "my-cost",
"before": [
{
"url": "http://localhost:8800/budget/reset",
"body": {}
},
{
"url": "http://localhost:8800/usage-clear",
"body": {}
},
{
"url": "http://localhost:8800/budget",
"body": {
"user_limit_per_min": 2
}
}
],
"after": [
{
"url": "http://localhost:8800/budget/reset",
"body": {}
},
{
"url": "http://localhost:8800/usage-clear",
"body": {}
}
],
"cases": [
{
"name": "이준호 1번째",
"request": "requests/faq-vpn.json",
"expect": {
"status": 200
}
},
{
"name": "이준호 2번째",
"body": {
"question": "프린터 출력이 안 돼요",
"user": "이준호"
},
"expect": {
"status": 200
}
},
{
"name": "이준호 3번째 · 1분에 2번 넘음",
"request": "requests/faq-vpn.json",
"expect": {
"status": 429,
"equals": {
"route": "잠시 후",
"cost_usd": 0
},
"max_seconds": 1
}
},
{
"name": "다른 사람은 그대로",
"request": "requests/faq-password.json",
"expect": {
"status": 200
}
}
]
}
+93
View File
@@ -0,0 +1,93 @@
{
"webhook": "my-cost",
"after": [
{
"url": "http://localhost:8800/budget/reset",
"body": {}
},
{
"url": "http://localhost:8800/usage-clear",
"body": {}
}
],
"cases": [
{
"name": "한도를 넘으면 · FAQ 원문",
"request": "requests/faq-vpn.json",
"before": [
{
"url": "http://localhost:8800/usage-clear",
"body": {}
},
{
"url": "http://localhost:8800/budget",
"body": {
"daily_usd": 0.001
}
},
{
"url": "http://localhost:8800/usage",
"body": {
"request_id": "seed",
"user": "seed",
"step": "answer",
"model": "gpt-4.1-mini",
"cost_usd": 0.002
}
}
],
"expect": {
"equals": {
"route": "한도 초과",
"cost_usd": 0,
"llm_calls": 0
},
"contains": {
"answer": [
"인증서"
]
}
}
},
{
"name": "한도를 넘으면 · 접수 원문",
"request": "requests/ticket-own.json",
"expect": {
"equals": {
"route": "한도 초과",
"cost_usd": 0
},
"contains": {
"answer": [
"처리 중"
]
}
}
},
{
"name": "한도 안이면 평소대로",
"request": "requests/faq-vpn.json",
"before": [
{
"url": "http://localhost:8800/budget/reset",
"body": {}
},
{
"url": "http://localhost:8800/usage-clear",
"body": {}
}
],
"expect": {
"equals": {
"route": "자동 답변"
},
"range": {
"cost_usd": [
1e-06,
0.0002
]
}
}
}
]
}