[하네스] - agents/validation-learner.md: 소스 AST 파싱 validation 학습 에이전트 - agents/rpa-bot.md: 학습 규칙 참조 자동화 실행 에이전트 - skills/rpa-orchestrator/SKILL.md: RPA E2E 워크플로우 스킬 - skills/rpa-validation/SKILL.md: 소스 기반 validation 학습 스킬 [구현] - core/rpa_engine.py: ValidationLearner(AST 파서) + RPAValidator + RPAExecutor - routers/rpa.py: 11개 API 엔드포인트 POST /api/rpa/validations/learn — models.py AST 파싱 → 1357개 규칙 학습 GET /api/rpa/validations — 학습 규칙 조회 (119 endpoints) POST /api/rpa/tasks — RPA 작업 등록 POST /api/rpa/execute — 즉시 실행 (validation + API 호출) GET /api/rpa/executions — 실행 이력 [테스트 결과] - validation 학습: 140개 스키마 / 1357개 규칙 / 119개 엔드포인트 - WRONG_TYPE → enum 오류 감지 정확 - 필수 필드 누락 → validation 오류 상세 반환 - 실행 이력 조회 정상 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
117 lines
3.8 KiB
Markdown
117 lines
3.8 KiB
Markdown
---
|
|
name: rpa-validation
|
|
description: "RPA 입력 항목 Validation 학습 스킬. ITSM 프로젝트 소스코드(models.py, routers/)에서 Pydantic 스키마를 파싱하여 모든 입력 항목의 validation 규칙(타입·필수·제약·enum)을 학습하고 DB에 저장한다. 다음 상황에서 반드시 사용: (1) 'validation 학습', 'API 스키마 학습', '입력 규칙 학습'; (2) 'Pydantic 모델 파싱', '소스 분석'; (3) RPA 봇 실행 전 입력 검증 규칙 갱신; (4) 새 라우터/모델 추가 후 재학습; (5) 다시 실행, 업데이트, 보완."
|
|
---
|
|
|
|
# RPA Validation 학습 스킬
|
|
|
|
ITSM 프로젝트 소스코드를 직접 분석하여 모든 입력 항목의 validation 규칙을 학습한다.
|
|
|
|
---
|
|
|
|
## 학습 전략: 소스 기반 정적 분석
|
|
|
|
OpenAPI JSON 대신 **소스코드를 직접 파싱**한다.
|
|
이유: OpenAPI JSON은 일부 validator가 누락되고, 소스 파싱이 더 정확하다.
|
|
|
|
### 학습 대상 파일
|
|
|
|
```
|
|
itsm/models.py ← Pydantic BaseModel (SRCreate, SRStatusUpdate, 등)
|
|
itsm/routers/*.py ← 각 라우터에서 사용하는 스키마 매핑
|
|
```
|
|
|
|
### 파싱 방법
|
|
|
|
`POST /api/rpa/validations/learn` 호출 시 서버가:
|
|
1. `itsm/models.py` AST 파싱
|
|
2. `class XXXCreate(BaseModel)` / `class XXXUpdate(BaseModel)` 클래스 탐색
|
|
3. 각 클래스의 필드 분석:
|
|
|
|
```python
|
|
# 분석 대상 패턴
|
|
class SRCreate(BaseModel):
|
|
sr_type: SRType # Enum → allowed_values 추출
|
|
title: str # required str
|
|
description: Optional[str] = None # optional
|
|
priority: Priority = Priority.MEDIUM # enum + default
|
|
server_id: Optional[int] = None # optional int
|
|
inst_id: int # required int
|
|
assigned_to: Optional[str] = None
|
|
```
|
|
|
|
### 추출되는 규칙 구조
|
|
|
|
```json
|
|
{
|
|
"endpoint": "POST /api/tasks",
|
|
"schema_class": "SRCreate",
|
|
"field_name": "sr_type",
|
|
"field_type": "enum",
|
|
"is_required": true,
|
|
"allowed_values": ["DEPLOY", "RESTART", "LOG", "INQUIRY", "OTHER"],
|
|
"default": null,
|
|
"constraints": {}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 학습 API
|
|
|
|
```
|
|
POST /api/rpa/validations/learn
|
|
Body: { "source_path": "auto", "overwrite": true }
|
|
|
|
응답:
|
|
{
|
|
"learned": 127,
|
|
"schemas": ["SRCreate", "SRStatusUpdate", "InstitutionCreate", ...],
|
|
"endpoints_mapped": 43,
|
|
"errors": []
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 검증 적용
|
|
|
|
RPA 봇이 `POST /api/rpa/execute` 호출 시:
|
|
|
|
```python
|
|
# 내부 검증 흐름
|
|
rules = db.query(RPAValidationRule).filter_by(endpoint="POST /api/tasks")
|
|
for rule in rules:
|
|
field_val = payload.get(rule.field_name)
|
|
if rule.is_required and field_val is None:
|
|
raise RPAValidationError(f"{rule.field_name}: 필수 항목")
|
|
if rule.field_type == "enum" and field_val not in rule.allowed_values:
|
|
raise RPAValidationError(
|
|
f"{rule.field_name}: 허용값 {rule.allowed_values} 중 하나"
|
|
)
|
|
if rule.constraints.get("max_length") and len(str(field_val)) > rule.constraints["max_length"]:
|
|
raise RPAValidationError(f"{rule.field_name}: 최대 {rule.constraints['max_length']}자")
|
|
```
|
|
|
|
---
|
|
|
|
## 주요 학습 대상 스키마
|
|
|
|
| 스키마 | 엔드포인트 | 핵심 필드 |
|
|
|--------|----------|---------|
|
|
| SRCreate | POST /api/tasks | sr_type(enum), title(required), inst_id(required) |
|
|
| SRStatusUpdate | PATCH /api/tasks/{id}/status | status(enum), comment |
|
|
| InstitutionCreate | POST /api/institutions | inst_code, inst_name |
|
|
| ServerCreate | POST /api/servers | server_name, inst_id, server_role |
|
|
| ApprovalCreate | POST /api/approvals | sr_id, result(enum) |
|
|
| IncidentCreate | POST /api/incidents | title, severity(enum), server_id |
|
|
|
|
---
|
|
|
|
## 재학습 트리거 조건
|
|
|
|
- 신규 라우터 추가 후
|
|
- models.py 스키마 변경 후
|
|
- RPA 봇 validation 오류 급증 시
|
|
- 주 1회 자동 재학습 (스케줄러)
|