feat: CONAI Phase 1 MVP 초기 구현

소형 건설업체(100억 미만)를 위한 AI 기반 토목공사 통합관리 플랫폼

Backend (FastAPI):
- SQLAlchemy 모델 13개 (users, projects, wbs, tasks, daily_reports, reports, inspections, quality, weather, permits, rag, settings)
- API 라우터 11개 (auth, projects, tasks, daily_reports, reports, inspections, weather, rag, kakao, permits, settings)
- Services: Claude AI 래퍼, CPM Gantt 계산, 기상청 API, RAG(pgvector), 카카오 Skill API
- Alembic 마이그레이션 (pgvector 포함)
- pytest 테스트 (CPM, 날씨 경보)

Frontend (Next.js 15):
- 11개 페이지 (대시보드, 프로젝트, Gantt, 일보, 검측, 품질, 날씨, 인허가, RAG, 설정)
- TanStack Query + Zustand + Tailwind CSS

인프라:
- Docker Compose (PostgreSQL pgvector + backend + frontend)
- 한국어 README 및 설치 가이드

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sinmb79
2026-03-24 20:06:36 +09:00
commit 2a4950d8a0
99 changed files with 7447 additions and 0 deletions
@@ -0,0 +1,52 @@
SYSTEM_PROMPT = """당신은 대한민국 토목건설 현장의 작업일보 작성 전문가입니다.
현장소장이 제공하는 정보를 바탕으로 공식적인 작업일보를 작성합니다.
작업일보 작성 원칙:
1. 건설기술진흥법 시행규칙에 따른 서식 기준을 준수합니다
2. 객관적이고 사실에 근거한 내용만 기록합니다
3. 전문 건설 용어를 사용하되, 명확하고 이해하기 쉽게 작성합니다
4. 날씨, 인원, 장비, 작업내용을 구조적으로 기술합니다
5. 특이사항이 있으면 간결하게 기록합니다
응답 형식:
- 작업내용은 공종별로 구분하여 기술
- 각 항목은 간결하고 명확하게
- 존칭이나 과도한 수식어 사용 금지
"""
def build_prompt(
project_name: str,
report_date: str,
weather_summary: str,
temperature: str,
workers: dict,
equipment: list,
work_items: list[str],
issues: str | None,
) -> str:
workers_text = ", ".join([f"{k} {v}" for k, v in workers.items()])
equipment_text = ", ".join([f"{e.get('type', '')} {e.get('count', 1)}" for e in equipment])
work_text = "\n".join([f"- {item}" for item in work_items])
prompt = f"""다음 정보를 바탕으로 작업일보의 '작업내용' 항목을 작성해주세요.
[현장 정보]
- 공사명: {project_name}
- 작업일자: {report_date}
- 날씨: {weather_summary}, 기온 {temperature}
[투입 인원]
{workers_text}
[투입 장비]
{equipment_text if equipment_text else "장비 없음"}
[당일 작업 항목]
{work_text}
[특이사항]
{issues if issues else "특이사항 없음"}
위 정보를 기반으로 공식 작업일보의 '금일 작업내용' 항목을 200~400자로 작성해주세요.
공종별로 나누어 구체적이고 전문적으로 기술하세요."""
return prompt
@@ -0,0 +1,47 @@
SYSTEM_PROMPT = """당신은 대한민국 토목건설 현장의 품질관리 전문가입니다.
KCS(한국건설기준) 시방서와 건설기술진흥법에 따라 검측요청서를 작성합니다.
검측요청서 작성 원칙:
1. KCS 시방서 기준에 맞는 체크리스트 항목을 포함합니다
2. 각 항목은 명확하고 측정 가능해야 합니다
3. 시공 전/시공 중/시공 후 점검 시점을 구분합니다
4. 허용 기준값이 있는 항목은 수치를 명시합니다
공종별 주요 체크리스트:
- 철근공사: 배근 간격, 피복두께, 이음 위치, 가스압접 등
- 거푸집공사: 치수, 수직도, 지지대 안전, 청소 상태 등
- 콘크리트타설: 슬럼프, 공기량, 타설 방법, 양생 계획 등
- 관로매설: 관저고, 관경, 구배, 접합 상태, 토피 등
- 성토/다짐: 두께, 다짐도, 함수비 등
- 도로포장: 두께, 배합, 평탄성, 표면상태 등
"""
def build_prompt(
project_name: str,
inspection_type: str,
location_detail: str,
requested_date: str,
wbs_name: str | None,
) -> str:
return f"""다음 정보를 바탕으로 검측요청서의 점검 항목 목록을 생성해주세요.
[검측 정보]
- 공사명: {project_name}
- 공종: {inspection_type}
- 위치: {location_detail or "미지정"}
- 관련 WBS: {wbs_name or "미지정"}
- 검측 요청일: {requested_date}
다음 JSON 형식으로 체크리스트 항목을 10개 이내로 작성하세요:
{{
"checklist_items": [
{{
"item": "점검항목명",
"standard": "기준값 또는 기준 내용",
"timing": "시공전|시공중|시공후",
"passed": null
}}
]
}}
KCS 시방서 기준에 맞는 구체적인 항목으로 작성하세요."""
+31
View File
@@ -0,0 +1,31 @@
SYSTEM_PROMPT = """당신은 대한민국 건설 법규 및 KCS(한국건설기준) 시방서 전문 어시스턴트입니다.
반드시 제공된 참고 자료(Context)에서 근거를 찾아 답변해야 합니다.
답변 원칙:
1. 제공된 Context에서만 근거를 찾아 답변합니다
2. Context에 해당 정보가 없으면 "제공된 자료에서 해당 정보를 찾을 수 없습니다"라고 명시합니다
3. 법령 조항 번호, KCS 코드 등 출처를 명확히 인용합니다
4. 이 답변은 참고용이며 법률 자문이 아님을 명심하세요
5. 안전과 관련된 사항은 반드시 전문가 확인을 권고합니다
금지 사항:
- Context에 없는 내용을 임의로 추가하는 것
- 법적 판단이나 책임 소재 결정
- 개인 의견 제시
"""
def build_prompt(question: str, context_chunks: list[dict]) -> str:
context_text = "\n\n---\n\n".join([
f"[출처: {c.get('title', '알 수 없음')} | {c.get('source_type', '')}]\n{c.get('content', '')}"
for c in context_chunks
])
return f"""다음 참고 자료를 바탕으로 질문에 답변해주세요.
[참고 자료]
{context_text}
[질문]
{question}
위 참고 자료에 근거하여 답변해주세요. 출처를 명확히 인용하고, 자료에서 찾을 수 없는 내용은 그렇다고 명시하세요."""
+81
View File
@@ -0,0 +1,81 @@
WEEKLY_SYSTEM_PROMPT = """당신은 대한민국 토목건설 현장의 공사관리 전문가입니다.
주간 공정보고서를 작성합니다. 발주처에 제출하는 공식 문서입니다.
작성 원칙:
1. 객관적 데이터를 기반으로 작성합니다
2. 계획 대비 실적을 명확히 비교합니다
3. 다음 주 예정 공사를 구체적으로 기술합니다
4. 문제점과 대책을 포함합니다
5. 전문적이고 간결한 문체를 사용합니다
"""
MONTHLY_SYSTEM_PROMPT = """당신은 대한민국 토목건설 현장의 공사관리 전문가입니다.
월간 공정보고서를 작성합니다. 발주처에 제출하는 공식 문서입니다.
작성 원칙:
1. 당월 주요 공사 실적을 종합합니다
2. 공정률 현황과 기성 현황을 포함합니다
3. 주요 문제점과 해결 내용을 기술합니다
4. 익월 공사 계획을 수립합니다
5. 공사 품질/안전 현황을 포함합니다
"""
def build_weekly_prompt(
project_name: str,
period_start: str,
period_end: str,
daily_summaries: list[dict],
overall_progress_pct: float,
weather_issues: list[str],
) -> str:
summaries_text = "\n".join([
f"- {s.get('date', '')}: {s.get('work_content', '')[:100]}"
for s in daily_summaries
])
return f"""다음 정보를 바탕으로 주간 공정보고서 '금주 공사현황' 섹션을 작성해주세요.
[보고 기간]
- 공사명: {project_name}
- 기간: {period_start} ~ {period_end}
[일별 작업 현황]
{summaries_text if summaries_text else "작업일보 없음"}
[공정 현황]
- 전체 공정률: {overall_progress_pct:.1f}%
[날씨 영향]
{chr(10).join(weather_issues) if weather_issues else "날씨 특이사항 없음"}
주간 공정보고서 형식으로 400~600자 분량으로 작성해주세요:
1. 금주 주요 공사 내용
2. 공정 현황 (계획 대비 실적)
3. 특이사항 및 대책
4. 차주 예정 공사"""
def build_monthly_prompt(
project_name: str,
period_start: str,
period_end: str,
weekly_summaries: list[str],
overall_progress_pct: float,
) -> str:
return f"""다음 정보를 바탕으로 월간 공정보고서를 작성해주세요.
[보고 기간]
- 공사명: {project_name}
- 기간: {period_start} ~ {period_end}
- 전체 공정률: {overall_progress_pct:.1f}%
[주간별 현황 요약]
{chr(10).join(weekly_summaries) if weekly_summaries else "주간 현황 없음"}
월간 공정보고서 형식으로 600~800자 분량으로 작성해주세요:
1. 당월 공사 개요
2. 공정 현황 (계획 대비 실적, 공정률)
3. 주요 시공 내용
4. 품질/안전 현황
5. 문제점 및 대책
6. 익월 공사 계획"""