WBS: 1-4g, 1-4h (Phase 1 확장)
파일: analyze/dependency.py, ontology/schema.py
학술 근거: RESTler (ICSE 2019), Arazzo Specification (OpenAPI Initiative)
커머스 BO API 같은 대형 시스템에서는 API 간 호출 순서가 존재한다:
주문 목록 조회 → 주문 상세 조회 → 주문 취소 요청
(listOrders) (getOrder) (cancelOrder)
주문 목록을 조회하지 않으면 주문 취소가 불가능.
이 순서 관계를 자동으로 감지해야 한다.
기존 관계 타입에 추가:
class RelationType(str, Enum):
REQUIRES = "requires" # A 없으면 B 호출 불가
COMPLEMENTARY = "complementary" # A와 B를 함께 쓰면 유용
SIMILAR_TO = "similar_to" # A와 B가 유사 기능
CONFLICTS_WITH = "conflicts_with" # A와 B가 충돌
BELONGS_TO = "belongs_to" # 카테고리 소속
PRECEDES = "precedes" # A → B 호출 순서 (NEW)PRECEDES는 REQUIRES와 다르다:
- REQUIRES: A의 출력이 B의 입력에 필요 (데이터 의존)
- PRECEDES: A를 먼저 호출해야 B가 의미있음 (워크플로우 순서)
예시:
listOrdersPRECEDEScancelOrder— 목록에서 선택해야 취소 가능createPaymentPRECEDEScapturePayment— 결제 생성 후 캡처addToCartPRECEDEScheckout— 장바구니 담은 후 결제
API 스키마의 enum 필드에서 상태 전이를 추론:
def detect_state_transitions(tools, spec):
"""enum 필드 + status/state 필드명으로 상태 머신 추론."""
relations = []
# 1. status/state enum 필드 찾기
state_fields = find_state_fields(spec)
# e.g., Order.status: ["pending", "confirmed", "shipped", "cancelled"]
# 2. 각 tool이 어떤 상태 전이를 일으키는지 추론
for tool in tools:
method = tool.metadata.get("method", "").upper()
# POST → 초기 상태 생성
# PUT/PATCH → 상태 변경
# DELETE → 최종 상태
# 3. 상태 순서로 PRECEDES 관계 생성
# pending → confirmed: createOrder PRECEDES confirmOrder
# confirmed → shipped: confirmOrder PRECEDES shipOrder
return relations기존 CRUD 감지를 확장하여 호출 순서 추론:
CRUD_WORKFLOW = {
# 표준 CRUD 순서
"create": 0, # POST
"read": 1, # GET /{id}
"list": 1, # GET /
"update": 2, # PUT/PATCH
"delete": 3, # DELETE
}
# 같은 리소스의 CRUD는 순서 관계
# create(0) PRECEDES read(1) PRECEDES update(2) PRECEDES delete(3)# 접두사/접미사 패턴으로 순서 감지
"initiate" / "start" / "begin" → 선행 단계
"complete" / "finish" / "finalize" → 후행 단계
"verify" / "validate" / "confirm" → 중간 단계
# 예: initiatePayment → verifyPayment → completePayment
Arazzo Specification — OpenAPI 공식 워크플로우 표준:
# arazzo.yaml 예시
workflows:
- workflowId: pet-purchase
steps:
- stepId: login
operationId: loginUser
- stepId: find-pet
operationId: findPetsByStatus
dependsOn: login
- stepId: place-order
operationId: placeOrder
dependsOn: find-petArazzo spec이 있으면 완벽한 순서 관계를 추출할 수 있다. 없으면 Layer 1+2의 휴리스틱으로 추론.
[장바구니] → [주문 생성] → [결제] → [배송] → [완료/취소/반품]
addToCart
→ PRECEDES → createOrder
→ PRECEDES → initiatePayment
→ PRECEDES → confirmPayment
→ PRECEDES → createShipment
→ PRECEDES → confirmDelivery
createPaymentIntent → confirmPaymentIntent → capturePaymentIntent
↘ cancelPaymentIntent (분기)
StateType별 전이:
OrderState: Open → Confirmed → Complete / Cancelled
PaymentState: BalanceDue → Paid → CreditOwed
ShipmentState: Shipped → Delivered / Returned
각 상태 전이에 대응하는 API가 PRECEDES 관계
| 패턴 | 예시 | 대응 |
|---|---|---|
| 병렬 가능 API를 순서로 잘못 감지 | updateAddress, updatePhone | 같은 단계(동일 CRUD level)면 PRECEDES 아님 |
| 조건부 순서 | cancelOrder는 shipped 상태에서만 | confidence 낮게 (0.6), 조건 메타데이터 기록 |
| 순환 워크플로우 | refund → re-order → refund | DFS cycle detection으로 순환 제거 |
DetectedRelation(
source="listOrders",
target="cancelOrder",
relation_type=RelationType.PRECEDES,
confidence=0.85,
evidence="CRUD workflow: list(1) precedes delete(3) on same resource 'orders'",
layer=1,
)| Phase | 작업 | 설명 |
|---|---|---|
| 1 | CRUD workflow ordering | CRUD 패턴에서 순서 추론 |
| 1 | State field detection | enum status 필드에서 상태 머신 |
| 1 | PRECEDES RelationType 추가 | 온톨로지 스키마 확장 |
| 2 | Naming convention ordering | 접두사/접미사 패턴 |
| 2 | Arazzo spec 지원 | 워크플로우 명세서 파싱 |
| 3 | 커머스 도메인 프리셋 | 주문/결제/배송 패턴 템플릿 |