G-1: 메신저 Webhook Relay + _send_to_room 실제 httpx 호출 구현 G-2: POST /api/tasks/bulk SR 대량작업 엔드포인트 (최대 100건) G-3: 라이선스 만료 알림 스케줄러 (매일 09:00 KST) G-4: 체험판 upgrade_banner 필드 + license.py 배너 로직 G-5: core/auto_rca.py + incidents/problem auto-rca 엔드포인트 G-6: core/deploy_impact.py + vibe impact-analysis 엔드포인트 G-7: core/ticket_classifier.py + SR 생성 시 AI 분류 + ai-suggestion API G-8: VulnPatchRecord 모델 + vuln_scan 패치추적 4개 엔드포인트 G-9: core/jira_sync.py + gateway Jira/Confluence 연동 엔드포인트 G-10: core/push_notify.py + routers/push.py + PushSubscription 모델 G-11: approvals 다중승인 (위임/서명/기한초과/마감연장) G-12: alembic.ini + migrations/ + cicd/migrate_to_postgres.sh 하네스: guardia-orchestrator 확장기능 Phase 반영 봇명령어: /sr /status /license /bulk 슬래시 명령어 추가 설치스크립트: setup/ (Ubuntu, CentOS, RHEL, Windows) --test 옵션 포함 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
670 lines
22 KiB
Markdown
670 lines
22 KiB
Markdown
# GUARDiA ITSM — AI 에이전트 (Paperclip × GUARDiA) 설계서
|
||
|
||
**문서 버전**: 1.0
|
||
**작성일**: 2026-05-25
|
||
**대상 독자**: 개발자, DevOps 엔지니어, 운영 관리자
|
||
|
||
---
|
||
|
||
## 목차
|
||
|
||
1. [개요 및 목적](#1-개요-및-목적)
|
||
2. [아키텍처 설계](#2-아키텍처-설계)
|
||
3. [Phase 1 — Paperclip 개발 도구 설정](#3-phase-1--paperclip-개발-도구-설정)
|
||
4. [Phase 2 — Ollama 로컬 LLM 설정](#4-phase-2--ollama-로컬-llm-설정)
|
||
5. [Phase 3 — GUARDiA 에이전트 엔진](#5-phase-3--guardia-에이전트-엔진)
|
||
6. [Phase 4 — 자율 운영 대시보드](#6-phase-4--자율-운영-대시보드)
|
||
7. [API 엔드포인트 설계](#7-api-엔드포인트-설계)
|
||
8. [보안 제약사항](#8-보안-제약사항)
|
||
9. [스케줄러 잡 설계](#9-스케줄러-잡-설계)
|
||
10. [테스트 결과](#10-테스트-결과)
|
||
11. [운영 가이드](#11-운영-가이드)
|
||
12. [향후 로드맵](#12-향후-로드맵)
|
||
|
||
---
|
||
|
||
## 1. 개요 및 목적
|
||
|
||
### 1.1 배경
|
||
|
||
GUARDiA ITSM은 온프레미스 IT 서비스 관리 플랫폼으로, 서비스 요청(SR), 장애 관리, SSL 인증서 모니터링, PM 일정 관리, SI 프로젝트 관리를 제공합니다.
|
||
|
||
AI 에이전트 기능 추가를 통해 다음 목표를 달성합니다:
|
||
|
||
- **반복 업무 자동화**: 장애 분류, KB 등록, SSL 갱신 SR 생성 등 반복적인 운영 업무를 AI가 자동 처리
|
||
- **능동적 모니터링**: 에이전트가 주기적으로 시스템 상태를 확인하고 이상 징후를 감지
|
||
- **사람-AI 협업**: 고위험 작업은 사람의 승인을 거쳐 실행하는 거버넌스 체계
|
||
|
||
### 1.2 Paperclip 프레임워크 채택
|
||
|
||
[Paperclip](https://github.com/paperclipai/paperclip)은 AI 에이전트 오케스트레이션 오픈소스 프레임워크입니다.
|
||
|
||
| 특징 | 설명 |
|
||
|------|------|
|
||
| 조직도 구조 | CEO → CTO → 개발자/QA 계층적 에이전트 관리 |
|
||
| 하트비트 시스템 | 에이전트가 주기적으로 깨어나 작업 수행 후 대기 |
|
||
| 이슈 추적 | GitHub 스타일의 태스크/이슈 관리 |
|
||
| 거버넌스 | 위험 수준에 따른 사람 승인 게이트 |
|
||
|
||
### 1.3 보안 원칙
|
||
|
||
> **외부 LLM/AI API 완전 금지** — 모든 AI 추론은 Ollama (localhost:11434) 를 통해 온프레미스에서 처리
|
||
|
||
---
|
||
|
||
## 2. 아키텍처 설계
|
||
|
||
### 2.1 전체 구조
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────────┐
|
||
│ GUARDiA ITSM │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||
│ │ FastAPI Layer │ │
|
||
│ │ /api/agents/* ←──────────────────── agents.html (SPA) │ │
|
||
│ └─────────────────────────────────────────────────────────────┘ │
|
||
│ │ │
|
||
│ ┌─────────────────────────▼─────────────────────────────────┐ │
|
||
│ │ AgentEngine (core) │ │
|
||
│ │ │ │
|
||
│ │ INCIDENT_TRIAGE KB_CURATOR SSL_WATCHER │ │
|
||
│ │ WBS_MONITOR PM_SUGGESTER DEVELOPER │ │
|
||
│ └─────────────────────────────────────────────────────────────┘ │
|
||
│ │ │
|
||
│ ┌────────────────┐ ┌─────▼───────────────────────────────┐ │
|
||
│ │ APScheduler │──▶│ OllamaClient (LLM 추론) │ │
|
||
│ │ (9 cron jobs) │ │ localhost:11434 │ │
|
||
│ └────────────────┘ └─────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||
│ │ SQLite DB: tb_agent_config | tb_agent_task | tb_agent_approval│
|
||
│ └─────────────────────────────────────────────────────────────┘ │
|
||
└──────────────────────────────────────────────────────────────────┘
|
||
|
||
외부(개발 시에만):
|
||
Paperclip CLI ──── paperclip.config.json ──── agents/*.md
|
||
```
|
||
|
||
### 2.2 에이전트 조직도
|
||
|
||
```
|
||
┌─────────────┐
|
||
│ CEO │ 전략·결재
|
||
└──────┬──────┘
|
||
┌────────┴────────┐
|
||
┌──────▼──────┐ ┌────▼──────┐
|
||
│ CTO │ │ PM_AGENT │ 프로젝트 관리
|
||
└──────┬──────┘ └───────────┘
|
||
┌──────┴────────┐
|
||
┌──▼──────┐ ┌────▼───┐
|
||
│DEVELOPER│ │ QA │
|
||
└─────────┘ └────────┘
|
||
|
||
운영 자동화 에이전트 (Ops):
|
||
INCIDENT_TRIAGE ← 장애 자동 분류
|
||
KB_CURATOR ← 지식베이스 자동 등록
|
||
SSL_WATCHER ← SSL 만료 감시
|
||
WBS_MONITOR ← WBS 지연 감지
|
||
PM_SUGGESTER ← PM 일정 제안
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Phase 1 — Paperclip 개발 도구 설정
|
||
|
||
### 3.1 파일 구조
|
||
|
||
```
|
||
C:\GUARDiA\
|
||
└── paperclip\
|
||
├── paperclip.config.json # 조직도 + 거버넌스 설정
|
||
├── README.md # 설치/사용 가이드
|
||
└── agents\
|
||
├── ceo.md # CEO 에이전트 페르소나
|
||
├── cto.md # CTO 에이전트 페르소나
|
||
├── developer.md # 개발자 에이전트 페르소나
|
||
└── qa.md # QA 에이전트 페르소나
|
||
```
|
||
|
||
### 3.2 설치
|
||
|
||
```bash
|
||
npm install -g @paperclipai/paperclip
|
||
|
||
# Paperclip 초기화 (프로젝트 루트에서)
|
||
cd C:\GUARDiA
|
||
paperclip init
|
||
|
||
# 에이전트 시작
|
||
paperclip start
|
||
```
|
||
|
||
### 3.3 조직도 구성 (paperclip.config.json 요약)
|
||
|
||
```json
|
||
{
|
||
"org_chart": {
|
||
"ceo": { "reports_to": null, "can_approve": ["deploy", "code_commit"] },
|
||
"cto": { "reports_to": "ceo" },
|
||
"developer": { "reports_to": "cto" },
|
||
"qa": { "reports_to": "cto" },
|
||
"pm_agent": { "reports_to": "ceo" }
|
||
},
|
||
"llm": {
|
||
"provider": "ollama",
|
||
"base_url": "http://localhost:11434",
|
||
"models": {
|
||
"ceo": "guardia-agent",
|
||
"developer": "codellama:7b",
|
||
"qa": "codellama:7b"
|
||
}
|
||
},
|
||
"governance": {
|
||
"require_human_approval": ["code_commit", "deploy", "delete_data"]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3.4 거버넌스 규칙
|
||
|
||
| 액션 | 승인 방식 | 승인자 |
|
||
|------|-----------|--------|
|
||
| code_commit | 사람 승인 필수 | CTO 또는 CEO |
|
||
| deploy | 사람 승인 필수 | CEO |
|
||
| delete_data | 사람 승인 필수 | CEO |
|
||
| 장애 분류 (일반) | 자동 승인 | — |
|
||
| 장애 분류 (CRITICAL) | 사람 승인 필수 | 담당자 |
|
||
| KB 등록 | 자동 승인 | — |
|
||
| SSL 갱신 SR 생성 | 자동 승인 | — |
|
||
|
||
---
|
||
|
||
## 4. Phase 2 — Ollama 로컬 LLM 설정
|
||
|
||
### 4.1 파일 구조
|
||
|
||
```
|
||
C:\GUARDiA\
|
||
└── ollama\
|
||
├── setup.ps1 # 자동 설치 스크립트
|
||
└── Modelfile.guardia # 커스텀 모델 정의
|
||
```
|
||
|
||
### 4.2 자동 설치 (setup.ps1)
|
||
|
||
```powershell
|
||
# 실행 방법:
|
||
Set-ExecutionPolicy Bypass -Scope Process -Force
|
||
.\setup.ps1
|
||
|
||
# 스크립트 동작:
|
||
# 1. OllamaSetup.exe 다운로드
|
||
# 2. 설치 후 ollama serve 시작
|
||
# 3. 헬스체크 (10회 재시도)
|
||
# 4. llama3.1:8b + codellama:7b 풀링
|
||
# 5. guardia-agent 커스텀 모델 생성
|
||
```
|
||
|
||
### 4.3 guardia-agent 모델 (Modelfile.guardia)
|
||
|
||
```
|
||
FROM llama3.1:8b
|
||
SYSTEM """당신은 GUARDiA ITSM AI 운영 에이전트입니다.
|
||
한국어로 응답하며, IT 서비스 관리(ITSM)에 특화되어 있습니다.
|
||
보안 원칙: 외부 API 호출 금지, 민감 정보 노출 금지."""
|
||
PARAMETER temperature 0.2
|
||
PARAMETER num_predict 2048
|
||
```
|
||
|
||
### 4.4 OllamaClient API
|
||
|
||
| 메서드 | 설명 |
|
||
|--------|------|
|
||
| `health_check()` | Ollama 서버 상태 확인 |
|
||
| `list_models()` | 설치된 모델 목록 조회 |
|
||
| `resolve_model(preferred)` | 선호 모델이 없으면 fallback 모델 반환 |
|
||
| `chat(messages, model)` | 대화형 추론 |
|
||
| `generate(prompt, model)` | 단일 프롬프트 추론 |
|
||
| `json_generate(prompt, model)` | JSON 응답 추출 (코드블록 자동 제거) |
|
||
| `pull_model(model)` | 모델 다운로드 |
|
||
|
||
---
|
||
|
||
## 5. Phase 3 — GUARDiA 에이전트 엔진
|
||
|
||
### 5.1 파일 구조
|
||
|
||
```
|
||
C:\GUARDiA\itsm\
|
||
├── models.py # AgentConfig, AgentTask, AgentApproval 모델 추가
|
||
├── core\
|
||
│ ├── llm_client.py # OllamaClient 구현
|
||
│ └── agents.py # AgentEngine 구현
|
||
└── routers\
|
||
└── agents.py # 16개 REST API 엔드포인트
|
||
```
|
||
|
||
### 5.2 데이터 모델
|
||
|
||
#### AgentConfig (tb_agent_config)
|
||
|
||
| 컬럼 | 타입 | 설명 |
|
||
|------|------|------|
|
||
| id | INTEGER PK | 에이전트 ID |
|
||
| name | VARCHAR | 에이전트 이름 |
|
||
| role | VARCHAR | AgentRole enum |
|
||
| llm_provider | VARCHAR | ollama (고정) |
|
||
| llm_model | VARCHAR | 사용할 LLM 모델 |
|
||
| system_prompt | TEXT | 역할 설명 프롬프트 |
|
||
| heartbeat_cron | VARCHAR | 크론 표현식 |
|
||
| is_active | BOOLEAN | 활성화 여부 |
|
||
| status | VARCHAR | IDLE/ACTIVE/WORKING/ERROR/PAUSED |
|
||
| last_heartbeat | DATETIME | 마지막 실행 시각 |
|
||
| total_tasks | INTEGER | 누적 처리 태스크 수 |
|
||
| total_tokens | INTEGER | 누적 사용 토큰 수 |
|
||
|
||
#### AgentTask (tb_agent_task)
|
||
|
||
| 컬럼 | 타입 | 설명 |
|
||
|------|------|------|
|
||
| id | INTEGER PK | 태스크 ID |
|
||
| agent_id | INTEGER FK | 에이전트 참조 |
|
||
| title | VARCHAR | 태스크 제목 |
|
||
| status | VARCHAR | PENDING/IN_PROGRESS/COMPLETED/FAILED |
|
||
| input_data | JSON | 입력 데이터 |
|
||
| output_data | JSON | LLM 출력 결과 |
|
||
| tokens_used | INTEGER | 사용된 토큰 수 |
|
||
|
||
#### AgentApproval (tb_agent_approval)
|
||
|
||
| 컬럼 | 타입 | 설명 |
|
||
|------|------|------|
|
||
| id | INTEGER PK | 승인 ID |
|
||
| agent_id | INTEGER FK | 에이전트 참조 |
|
||
| task_id | INTEGER FK nullable | 연관 태스크 |
|
||
| action_type | VARCHAR | 액션 유형 |
|
||
| action_data | JSON | 액션 상세 데이터 |
|
||
| status | VARCHAR | PENDING/APPROVED/REJECTED/AUTO_APPROVED |
|
||
| reviewed_by | INTEGER FK nullable | 검토자 |
|
||
|
||
### 5.3 에이전트별 동작
|
||
|
||
#### INCIDENT_TRIAGE (15분마다 실행)
|
||
|
||
```
|
||
1. 미배정 장애(assigned_to=None, status=OPEN/RECEIVED) 조회
|
||
2. LLM JSON 분류 요청:
|
||
{ severity: CRITICAL/HIGH/MEDIUM/LOW,
|
||
category: HARDWARE/SOFTWARE/NETWORK/...,
|
||
reason: "분류 근거" }
|
||
3. CRITICAL → AgentApproval(PENDING) 생성
|
||
4. 그 외 → AUTO_APPROVED + Incident 등급 즉시 반영
|
||
```
|
||
|
||
#### KB_CURATOR (매시간 정각)
|
||
|
||
```
|
||
1. SR 완료 건 중 KB가 없는 건 조회
|
||
2. LLM KB 초안 생성:
|
||
{ kb_title, symptom, cause, solution, tags }
|
||
3. KBDocument 생성 (published=False, 검토 대기)
|
||
4. AgentApproval(AUTO_APPROVED) 기록
|
||
```
|
||
|
||
#### SSL_WATCHER (매일 08:30)
|
||
|
||
```
|
||
1. ssl_expire_date가 0~30일 이내인 서버 조회
|
||
2. 기존 SSL 갱신 SR이 없는 경우에만 SR 자동 생성
|
||
3. 긴급도: 7일 미만=CRITICAL, 30일 미만=HIGH
|
||
```
|
||
|
||
#### WBS_MONITOR (매일 08:00)
|
||
|
||
```
|
||
1. 진행 중 SI 프로젝트의 WBS 지연 항목 조회
|
||
2. 3일+ 지연: 주의, 10일+ 지연: CRITICAL
|
||
3. LLM 리스크 분석:
|
||
{ risk_level, probability, impact, title, mitigation_plan }
|
||
4. ProjectRisk 자동 등록
|
||
5. CRITICAL 리스크 → 사람 승인 필요
|
||
```
|
||
|
||
#### PM_SUGGESTER (매일 09:00)
|
||
|
||
```
|
||
1. PM 일정이 없는 서버 조회
|
||
2. 권장 PM 일정 제안 (AgentTask 기록)
|
||
```
|
||
|
||
#### DEVELOPER (수동 트리거 or 이슈 등록 시)
|
||
|
||
```
|
||
1. PENDING AgentTask 조회
|
||
2. LLM 코드/응답 생성
|
||
3. CODE_CHANGE 태스크 → AgentApproval(PENDING) 생성
|
||
```
|
||
|
||
### 5.4 하트비트 사이클
|
||
|
||
```
|
||
에이전트 등록 (AgentConfig 생성)
|
||
│
|
||
▼
|
||
APScheduler Cron 잡 등록
|
||
│
|
||
▼ (스케줄 도달)
|
||
status = ACTIVE
|
||
│
|
||
▼
|
||
Ollama health_check()
|
||
│ (실패)──────────────────► status = ERROR
|
||
│ (성공)
|
||
▼
|
||
_handler(db, agent) 실행
|
||
│
|
||
├─ 작업 완료 ──► AgentTask(COMPLETED) + status = IDLE
|
||
└─ 오류 발생 ──► AgentTask(FAILED) + status = ERROR
|
||
last_error 기록
|
||
```
|
||
|
||
---
|
||
|
||
## 6. Phase 4 — 자율 운영 대시보드
|
||
|
||
### 6.1 접근 경로
|
||
|
||
```
|
||
http://localhost:8001/agents
|
||
```
|
||
|
||
### 6.2 대시보드 구성
|
||
|
||
| 영역 | 설명 |
|
||
|------|------|
|
||
| LLM 상태 배너 | Ollama 온라인/오프라인 상태 실시간 표시 |
|
||
| 통계 카드 | 총 에이전트 수, 활성, 오늘 태스크, 오늘 토큰, 승인 대기 |
|
||
| 에이전트 탭 | 에이전트 카드 (역할 배지, 상태 펄스 애니메이션) |
|
||
| 조직도 탭 | 계층적 트리 렌더링 |
|
||
| 승인 대기 탭 | 보류 중 승인 목록 (CRITICAL 강조) |
|
||
| 태스크 피드 탭 | 전체 에이전트 태스크 실시간 피드 |
|
||
|
||
### 6.3 에이전트 상태 색상 코드
|
||
|
||
| 상태 | 색상 | 설명 |
|
||
|------|------|------|
|
||
| IDLE | 회색 | 대기 중 |
|
||
| ACTIVE | 파랑 | 심장박동 시작 |
|
||
| WORKING | 주황 (펄스) | 작업 진행 중 |
|
||
| ERROR | 빨강 | 오류 발생 |
|
||
| PAUSED | 노랑 | 일시 중지 |
|
||
|
||
### 6.4 역할별 색상 배지
|
||
|
||
```
|
||
CEO → 보라색 (#6C5CE7)
|
||
CTO → 파랑색 (#0984E3)
|
||
DEVELOPER → 초록색 (#00B894)
|
||
QA → 노랑색 (#FDCB6E)
|
||
PM_AGENT → 청록색 (#00CEC9)
|
||
|
||
INCIDENT_TRIAGE → 빨강 (#E17055)
|
||
KB_CURATOR → 민트 (#55EFC4)
|
||
SSL_WATCHER → 주황 (#FD79A8)
|
||
WBS_MONITOR → 남색 (#74B9FF)
|
||
PM_SUGGESTER → 연두 (#A29BFE)
|
||
```
|
||
|
||
---
|
||
|
||
## 7. API 엔드포인트 설계
|
||
|
||
### 7.1 전체 목록 (16개)
|
||
|
||
| HTTP | 경로 | 설명 | 권한 |
|
||
|------|------|------|------|
|
||
| GET | /api/agents | 에이전트 목록 | USER+ |
|
||
| POST | /api/agents | 에이전트 생성 | ADMIN |
|
||
| GET | /api/agents/stats | 통계 요약 | USER+ |
|
||
| GET | /api/agents/orgchart | 조직도 | USER+ |
|
||
| GET | /api/agents/approvals | 승인 대기 목록 | USER+ |
|
||
| PATCH | /api/agents/approvals/{id}/review | 승인/거부 | USER+ |
|
||
| GET | /api/agents/llm/health | LLM 상태 확인 | USER+ |
|
||
| POST | /api/agents/llm/pull | 모델 다운로드 | ADMIN |
|
||
| GET | /api/agents/{id} | 에이전트 상세 | USER+ |
|
||
| PATCH | /api/agents/{id} | 에이전트 수정 | ADMIN |
|
||
| DELETE | /api/agents/{id} | 에이전트 삭제 | ADMIN |
|
||
| POST | /api/agents/{id}/heartbeat | 수동 하트비트 | USER+ |
|
||
| POST | /api/agents/{id}/pause | 에이전트 일시정지 | ADMIN |
|
||
| POST | /api/agents/{id}/resume | 에이전트 재개 | ADMIN |
|
||
| GET | /api/agents/{id}/tasks | 태스크 목록 | USER+ |
|
||
| POST | /api/agents/{id}/tasks | 태스크 생성 | USER+ |
|
||
|
||
> CUSTOMER 역할: 모든 에이전트 엔드포인트 접근 불가
|
||
|
||
### 7.2 주요 스키마
|
||
|
||
#### AgentConfigOut
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"name": "장애 분류 에이전트",
|
||
"role": "INCIDENT_TRIAGE",
|
||
"description": "미배정 장애를 자동으로 분류합니다",
|
||
"llm_model": "guardia-agent",
|
||
"heartbeat_cron": "*/15 * * * *",
|
||
"is_active": true,
|
||
"status": "IDLE",
|
||
"last_heartbeat": "2026-05-25T08:15:00",
|
||
"total_tasks": 42,
|
||
"total_tokens": 15300
|
||
}
|
||
```
|
||
|
||
#### AgentApprovalReview
|
||
|
||
```json
|
||
{
|
||
"status": "APPROVED",
|
||
"notes": "내용 확인 후 승인합니다"
|
||
}
|
||
```
|
||
|
||
#### AgentStatsOut
|
||
|
||
```json
|
||
{
|
||
"total_agents": 6,
|
||
"active_agents": 4,
|
||
"today_tasks": 12,
|
||
"today_tokens": 5240,
|
||
"pending_approvals": 2
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 보안 제약사항
|
||
|
||
### 8.1 런타임 LLM 보안
|
||
|
||
| 규칙 | 내용 |
|
||
|------|------|
|
||
| 외부 API 금지 | 모든 LLM 호출은 localhost:11434 (Ollama) 만 허용 |
|
||
| 토큰 최대값 | num_predict: 2048 (무한 루프 방지) |
|
||
| 온도 고정 | temperature: 0.2 (결정론적 응답) |
|
||
| 타임아웃 | HTTP 요청 30초 타임아웃 |
|
||
|
||
### 8.2 에이전트 액션 보안
|
||
|
||
| 규칙 | 내용 |
|
||
|------|------|
|
||
| CRITICAL 액션 | 반드시 사람 승인 후 실행 |
|
||
| 위험 명령어 | `rm -rf /`, `shutdown`, `mkfs` 등 차단 |
|
||
| 서버 정보 | `ip_addr`, `ssh_user`, `os_pw_enc` API 응답 미포함 |
|
||
| 파일 경로 | `file_path` 컬럼 API 응답 절대 미노출 |
|
||
|
||
### 8.3 접근 제어
|
||
|
||
| 역할 | 에이전트 조회 | 에이전트 생성/수정/삭제 | 승인 처리 |
|
||
|------|--------------|----------------------|----------|
|
||
| CUSTOMER | ✗ | ✗ | ✗ |
|
||
| USER | ✓ | ✗ | ✓ |
|
||
| OPERATOR | ✓ | ✗ | ✓ |
|
||
| ADMIN | ✓ | ✓ | ✓ |
|
||
|
||
---
|
||
|
||
## 9. 스케줄러 잡 설계
|
||
|
||
### 9.1 전체 잡 목록 (9개)
|
||
|
||
| ID | 잡 이름 | 스케줄 | 설명 |
|
||
|----|---------|--------|------|
|
||
| 1 | cert_check | 매일 09:00 | SSL 인증서 만료 확인 |
|
||
| 2 | pm_check | 매일 09:05 | PM 점검 일정 확인 |
|
||
| 3 | on_call_notify | 매일 08:55 | 온콜 교대 알림 |
|
||
| 4 | batch_cleanup | 매일 02:00 | 배치 결과 정리 |
|
||
| 5 | agent_incident_triage | 매 15분 | 장애 자동 분류 |
|
||
| 6 | agent_kb_curator | 매시간 정각 | KB 자동 생성 |
|
||
| 7 | agent_ssl_watcher | 매일 08:30 | SSL 만료 감시 |
|
||
| 8 | agent_wbs_monitor | 매일 08:00 | WBS 지연 감지 |
|
||
| 9 | agent_pm_suggester | 매일 09:00 | PM 일정 제안 |
|
||
|
||
### 9.2 에이전트 하트비트 흐름
|
||
|
||
```
|
||
APScheduler → _agent_heartbeat_by_role(role)
|
||
│
|
||
▼
|
||
AgentConfig WHERE role=? AND is_active=True 조회
|
||
│
|
||
┌─────────┴───────────┐
|
||
없음│ │있음
|
||
▼ ▼
|
||
skip for each agent:
|
||
get_agent_engine().run_heartbeat(id)
|
||
```
|
||
|
||
---
|
||
|
||
## 10. 테스트 결과
|
||
|
||
### 10.1 구문 검사 (Syntax Check)
|
||
|
||
| 파일 | 결과 |
|
||
|------|------|
|
||
| `models.py` | ✅ 통과 |
|
||
| `main.py` | ✅ 통과 |
|
||
| `core/llm_client.py` | ✅ 통과 |
|
||
| `core/agents.py` | ✅ 통과 |
|
||
| `core/scheduler.py` | ✅ 통과 |
|
||
| `routers/agents.py` | ✅ 통과 |
|
||
|
||
### 10.2 심볼 검증
|
||
|
||
| 항목 | 검증 내용 | 결과 |
|
||
|------|-----------|------|
|
||
| AgentRole enum | 10가지 역할 정의 | ✅ |
|
||
| AgentEngine handlers | 6개 핸들러 구현 | ✅ |
|
||
| OllamaClient | 7개 메서드 구현 | ✅ |
|
||
| API 엔드포인트 | 16개 라우터 등록 | ✅ |
|
||
| 스케줄러 잡 | 9개 (기존 4 + 신규 5) | ✅ |
|
||
| main.py 라우터 | 34개 라우터 등록 | ✅ |
|
||
|
||
### 10.3 보안 검증
|
||
|
||
| 항목 | 결과 |
|
||
|------|------|
|
||
| 외부 LLM API 호출 없음 | ✅ |
|
||
| ServerOut에 ip_addr 미포함 | ✅ |
|
||
| CUSTOMER 역할 차단 | ✅ |
|
||
| CRITICAL 승인 게이트 | ✅ |
|
||
|
||
---
|
||
|
||
## 11. 운영 가이드
|
||
|
||
### 11.1 에이전트 등록
|
||
|
||
```bash
|
||
# 장애 분류 에이전트 등록
|
||
curl -X POST http://localhost:8001/api/agents \
|
||
-H "Authorization: Bearer <token>" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"name": "장애 분류 에이전트",
|
||
"role": "INCIDENT_TRIAGE",
|
||
"description": "미배정 장애를 자동으로 분류하고 우선순위를 설정합니다",
|
||
"llm_model": "guardia-agent",
|
||
"system_prompt": "당신은 IT 장애 분류 전문가입니다...",
|
||
"heartbeat_cron": "*/15 * * * *",
|
||
"is_active": true
|
||
}'
|
||
```
|
||
|
||
### 11.2 수동 하트비트 실행
|
||
|
||
```bash
|
||
# 에이전트 즉시 실행
|
||
curl -X POST http://localhost:8001/api/agents/1/heartbeat \
|
||
-H "Authorization: Bearer <token>"
|
||
```
|
||
|
||
### 11.3 승인 처리
|
||
|
||
```bash
|
||
# 승인
|
||
curl -X PATCH http://localhost:8001/api/agents/approvals/5/review \
|
||
-H "Authorization: Bearer <token>" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"status": "APPROVED", "notes": "내용 확인 후 승인"}'
|
||
|
||
# 거부
|
||
curl -X PATCH http://localhost:8001/api/agents/approvals/5/review \
|
||
-H "Authorization: Bearer <token>" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"status": "REJECTED", "notes": "추가 검토 필요"}'
|
||
```
|
||
|
||
### 11.4 LLM 상태 확인
|
||
|
||
```bash
|
||
# Ollama 서버 상태
|
||
curl http://localhost:8001/api/agents/llm/health
|
||
|
||
# 응답 예시
|
||
{
|
||
"healthy": true,
|
||
"models": ["guardia-agent:latest", "llama3.1:8b", "codellama:7b"],
|
||
"version": "0.1.x"
|
||
}
|
||
```
|
||
|
||
### 11.5 모니터링 대시보드
|
||
|
||
```
|
||
브라우저 접속: http://localhost:8001/agents
|
||
자동 갱신: 30초 간격
|
||
```
|
||
|
||
---
|
||
|
||
## 12. 향후 로드맵
|
||
|
||
| 단계 | 기능 | 예상 시기 |
|
||
|------|------|----------|
|
||
| v1.1 | 에이전트 간 메시지 전달 (CEO→CTO 위임) | 2026 Q3 |
|
||
| v1.2 | 에이전트 학습 (이전 태스크 기반 파인튜닝) | 2026 Q3 |
|
||
| v1.3 | 멀티모달 지원 (스크린샷 분석) | 2026 Q4 |
|
||
| v2.0 | 에이전트 마켓플레이스 (커뮤니티 에이전트) | 2027 Q1 |
|
||
| v2.1 | 엣지 배포 (경량 모델: llama3.2:1b) | 2027 Q1 |
|
||
|
||
---
|
||
|
||
*이 문서는 GUARDiA ITSM Paperclip × GUARDiA Phase 1~4 구현 내용을 담고 있습니다.*
|
||
*Ollama 공식 문서: https://ollama.com*
|
||
*Paperclip GitHub: https://github.com/paperclipai/paperclip*
|