본문으로 건너뛰기

[pydantic-ai] 자동 리뷰 봇 개선: Gateway 활용과 diff 라인 번호 주석

PR 링크: pydantic/pydantic-ai#4305 상태: Merged | 변경: +123 / -29

들어가며

pydantic-ai는 Claude Code를 활용한 자동 PR 리뷰 봇을 운영하고 있습니다. 이 PR은 리뷰 봇의 비용 효율과 정확도를 동시에 개선하기 위해 API gateway 도입, diff 라인 번호 자동 주석, 그리고 프롬프트 구조 재편을 수행합니다.

핵심 코드 분석

1. API Gateway 및 키 분리

Before:

- uses: anthropics/claude-code-action@v1
  with:
    anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

After:

- uses: anthropics/claude-code-action@v1
  env:
    ANTHROPIC_BASE_URL: ${{ secrets.CLAUDE_CODE_BASE_URL }}
  with:
    anthropic_api_key: ${{ secrets.CLAUDE_CODE_API_KEY || secrets.ANTHROPIC_API_KEY }}

별도의 CLAUDE_CODE_API_KEYCLAUDE_CODE_BASE_URL을 통해 gateway를 경유하도록 변경했습니다. fallback으로 기존 ANTHROPIC_API_KEY를 유지합니다.

2. diff 라인 번호 자동 주석 (awk 스크립트)

가장 핵심적인 변경은 gather-review-context.sh에 추가된 awk 스크립트입니다:

for diff_file in "$CTX/diff/"*.diff; do
  awk '
    /^@@ / {
        split($2, _o, ","); old_num = substr(_o[1], 2) + 0
        split($3, _n, ","); new_num = substr(_n[1], 2) + 0
    }
    {
        c = substr($0, 1, 1)
        if (c == "+") { prefix = "NL:" lnums[n]; new_num++ }
        else if (c == "-") { prefix = "OL:" lnums[n]; old_num++ }
        else { prefix = "NL:" lnums[n]; new_num++; old_num++ }
    }
  ' "$diff_file" > tmp && mv tmp "$diff_file"

각 diff 라인에 NL: (new line) 또는 OL: (old line) 접두사와 라인 번호를 추가합니다. 리뷰 봇이 인라인 코멘트를 달 때 정확한 라인을 타겟팅할 수 있습니다.

3. 프롬프트 구조 개선

리뷰 우선순위를 명확히 하고, 컨텍스트 수집과 코멘트 작성을 분리했습니다:

# What to look for (새로 구조화)
- public API > concepts and behavior > documentation > tests > code style

# Gathering context (병렬 읽기 장려)
- diff 파일을 필요에 따라 병렬로 읽기
- 큰 테스트 파일은 나중에 로드

# Posting comments (마지막에 한번에)
- 전체 맥락 파악 후 코멘트 작성

왜 이게 좋은가

라인 번호 주석은 AI 리뷰 봇이 인라인 코멘트를 달 때 가장 빈번하게 실패하는 원인(잘못된 라인 번호 계산)을 근본적으로 해결합니다. diff를 전처리하여 정확한 위치 정보를 제공함으로써, 봇이 라인 번호 계산에 컨텍스트를 낭비하지 않고 실제 코드 리뷰에 집중할 수 있습니다. Gateway 도입은 비용 추적과 rate limiting 등 운영 관리에도 유리합니다.

정리

항목 내용
Gateway 별도 API 키/URL로 비용 관리 분리
라인 번호 NL:/OL: 접두사로 인라인 코멘트 정확도 향상
프롬프트 우선순위 명확화 + 병렬 읽기 장려

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글