단 두 줄의 코드로 AI 에이전트의 프리징(Freezing) 현상을 해결한 방법
요약
오픈 소스 AI 에이전트인 Hermes Agent의 권한 관리 시스템에서 발생하는 빈 응답(None) 문제를 해결하는 방법을 다룹니다. 방어적 프로그래밍을 통해 예외 상황 발생 시 안전하게 요청을 거부하도록 수정하여 시스템 충돌을 방지했습니다.
핵심 포인트
- AI 에이전트 통신 중 발생하는 빈 응답(None) 처리의 중요성
- 가드 절(Guard clause) 패턴을 이용한 간단하고 효과적인 버그 수정
- 예외 케이스 처리를 통한 에이전트 시스템의 안정성 및 신뢰성 확보
- 수정 사항에 대한 테스트 코드 추가를 통한 안정성 검증
누군가에게 질문을 던졌는데 상대방이 그저 멍하니 당신을 바라본 적이 있나요? 인간에게는 어색한 상황이지만, 소프트웨어에게는 완전한 충돌 (Crash)을 일으킬 수 있는 상황입니다.
저는 최근 Hermes Agent 프로젝트에 버그 수정 (Bug fix)을 기여했습니다. 이는 자신의 컴퓨터에서 직접 실행할 수 있는 오픈 소스 (Open source) AI 시스템입니다. 저의 목표는 간단했습니다. 이 시스템의 권한 관리 시스템 (Permission system)을 훨씬 더 신뢰할 수 있게 만드는 것이었습니다.
제가 발견한 버그와 이를 어떻게 해결했는지, 그리고 왜 빈 응답 (Empty responses)을 처리하는 것이 소프트웨어 개발에서 중요한지에 대해 자세히 설명하겠습니다.
아무런 응답도 받지 못할 때의 위험성
Hermes와 같은 AI 에이전트를 실행하면, 사용자의 컴퓨터에서 명령을 실행하기 전에 권한을 요청해야 하는 경우가 많습니다. 에이전트는 승인 시스템 (Approval system)에 요청을 보냄으로써 이 작업을 수행합니다.
보통 시스템은 '승인 (Approve)' 또는 '거부 (Deny)'라는 명확한 답변을 보냅니다. 하지만 때때로 통신 파이프라인 (Communication pipeline)에서 문제가 발생할 수 있습니다. 시스템이 아예 아무런 응답도 받지 못하는 상황이 발생할 수 있는 것입니다.
Python에서 이러한 '멍한 응답'은 None이라고 불리는 특별한 값으로 표현됩니다. 기존 코드는 None을 어떻게 처리해야 하는지 알지 못했습니다. 만약 이 예상치 못한 빈 응답을 받게 되면, 코드는 소리 없이 실패하거나 에이전트 전체를 충돌 (Crash)시켰습니다.
민감한 작업을 수행하는 AI 에이전트를 다룰 때, 예측 불가능한 동작은 가장 피해야 할 상황입니다.
방어적 프로그래밍 (Defensive Coding)을 이용한 해결책
수정 사항은 작았지만 매우 효과적이었습니다. 저는 권한 시스템이 None 응답을 받을 경우, 안전하게 요청을 거부하도록 기본값 (Default)을 설정하는 간단한 체크 로직을 추가했습니다.
이 작은 안전망을 추가함으로써, 이제 에이전트는 신뢰할 수 있는 폴백 (Fallback) 메커니즘을 갖게 되었습니다. 이를 통해 충돌을 방지하고, 사용자의 명령이 공중에 붕 뜬 채로 남겨지는 일이 없도록 보장합니다.
모든 예외 케이스 (Edge case)를 잘 처리한다는 것은, 코드가 실제 환경에서 실행될 때 예상치 못한 상황을 줄인다는 것을 의미합니다.
코드
다음은 메인 파일인 acp_adapter/permissions.py에서 제가 수정한 정확한 내용입니다. 전형적인 가드 절 (Guard clause) 패턴입니다.
if response is None:
return "deny"
이러한 엣지 케이스 (edge case)가 향후 변경 사항으로부터 보호될 수 있도록, tests/acp/test_permissions.py에 테스트를 추가했습니다.
전체 병합된 풀 리퀘스트 (pull request)와 저장소는 여기서 확인할 수 있습니다.
GitHub logo fix(permissions): handle None response from ACP request_permission #13457
**aniruddhaadak80**님이 2026년 4월 21일에 게시함
이 PR은 무엇을 하나요?
이 PR은 request_permission으로부터 예상치 못한 None 결과가 반환될 때 이를 안전하게 처리함으로써 ACP-Hermes 권한 승인 브릿지 (permission-approval bridge)를 강화합니다. 이를 통해 속성 오류 (attribute errors)를 방지하고 기본적으로 안전한 거부 (deny) 상태로 설정합니다.
관련 이슈
Fixes #13449
변경 유형
- 🐛 버그 수정 (문제를 해결하는 비파괴적 변경)
- ✨ 새로운 기능 (기능을 추가하는 비파괴적 변경)
- 🔒 보안 수정
- 📝 문서 업데이트
- ✅ 테스트 (테스트 커버리지 추가 또는 개선)
- ♻️ 리팩터링 (동작 변경 없음)
- 🚀 새로운 스킬 (번들 또는 허브)
변경 사항
- 승인 콜백 (approval callback)에서
request_permission이None으로 결정될 때 "deny"를 반환합니다. None응답 케이스를 다루는 유닛 테스트 (unit test)를 추가하여 콜백이 안전하게 거부하는지 확인합니다.
테스트 방법
- 권한 요청에 빈 응답을 보내는 ACP 클라이언트를 통해 연결합니다.
- 예외 (exception)가 발생하는 대신 권한이 거부되는지 확인합니다.
체크리스트
코드
- 기여 가이드 (Contributing Guide)를 읽었습니다.
- 커밋 메시지가 Conventional Commits를 따릅니다.
- 중복 여부를 확인하기 위해 기존 PR을 검색했습니다.
- PR에 이 수정/기능과 관련된 변경 사항만 포함되어 있습니다 (관련 없는 커밋 없음).
-
pytest tests/ -q를 실행하였고 모든 테스트를 통과했습니다. - 변경 사항에 대한 테스트를 추가했습니다 (버그 수정 시 필수, 기능 추가 시 강력 권장).
- 내 플랫폼에서 테스트를 완료했습니다.
문서 및 정리
- 관련 문서(README, docs/, docstrings)를 업데이트했습니다 — 또는 해당 사항 없음
- 설정 키를 추가하거나 변경한 경우 cli-config.yaml.example을 업데이트했습니다 — 또는 해당 사항 없음
- 아키텍처나 워크플로우(workflows)를 변경한 경우 CONTRIBUTING.md 또는 AGENTS.md를 업데이트했습니다 — 또는 해당 사항 없음
- 호환성 가이드에 따라 교차 플랫폼 영향(Windows, macOS)을 고려했습니다 — 또는 해당 사항 없음
- 도구(tool)의 동작을 변경한 경우 도구 설명/스키마(schemas)를 업데이트했습니다 — 또는 해당 사항 없음
GitHub logo NousResearch / hermes-agent
당신과 함께 성장하는 에이전트
Hermes Agent ☤
Nous Research에서 구축한 자기 개선형(self-improving) AI 에이전트입니다. 이 에이전트는 내장된 학습 루프(learning loop)를 가진 유일한 에이전트입니다. 경험을 통해 기술을 생성하고, 사용 중에 이를 개선하며, 지식을 유지하도록 스스로를 독려하고, 자신의 과거 대화를 검색하며, 세션 전반에 걸쳐 당신이 누구인지에 대한 심화된 모델을 구축합니다. 5달러짜리 VPS, GPU 클러스터, 또는 유휴 상태일 때 비용이 거의 들지 않는 서버리스 인프라(serverless infrastructure)에서 실행할 수 있습니다. 노트북에 종속되지 않습니다. 에이전트가 클라우드 VM에서 작업하는 동안 Telegram을 통해 대화할 수 있습니다.
원하는 어떤 모델이든 사용할 수 있습니다 — Nous Portal, OpenRouter, OpenAI, 자체 엔드포인트 및 다른 많은 곳들을 이용할 수 있습니다. hermes model로 전환하세요 — 코드 변경이나 종속성 문제가 없습니다.
[IMG:N]
<table><tbody><tr><td><b>실제 터미널 인터페이스</b></td><td>다중 라인 편집, 슬래시 명령 자동 완성, 대화 기록, 중단 및 리디렉션, 스트리밍 도구 출력을 갖춘 전체 TUI(Text User Interface)를 제공합니다.</td></tr><tr><td><b>사용하는 곳에서 작동</b></td><td>Telegram, Discord, Slack, WhatsApp, Signal 등</td></tr></tbody></table>…
내부 작동 방식 (How It Works Behind the Scenes)
기술적인 측면에 궁금한 분들을 위해, Hermes는 백그라운드 작업을 사용하여 권한 요청을 처리합니다. 명령 승인이 필요할 때 에이전트는 일시 중지되고 핸들러의 응답을 기다립니다.
제가 업데이트한 코드에서는 해당 백그라운드 작업이 완료되었지만 None 응답만 반환하는 경우, 함수가 이를 가로챕니다. 즉시 deny를 반환합니다.
간단한 접근 방식이지만 완벽하게 작동합니다. 시스템 연결이 끊기는 등 특이한 네트워크 상황에서도 콜백 함수는 안전한 결과를 제공합니다. AI 에이전트는 계속해서 안전하게 실행됩니다.
이 수정에 사용된 기술 스택 (My Tech Stack for this Fix)
이를 구현하기 위해 저는 Python 생태계 내에서 광범위하게 작업했습니다. 백그라운드 권한 요청을 관리하기 위해 표준 asyncio 라이브러리를 사용했습니다.
테스트를 위해 모의 객체(mock object)와 함께 pytest를 사용했습니다. 백그라운드 작업을 인위적으로 None을 반환하도록 모킹함으로써, 코드가 올바르게 deny를 출력하는지 증명할 수 있었습니다. 이를 통해 전체 무거운 인프라를 시작할 필요 없이 수정 사항을 테스트할 수 있었습니다.
배운 교훈 (Lessons Learned)
이 수정 작업을 진행하면서 신뢰할 수 있는 AI 시스템을 구축하는 것에 대한 몇 가지 중요한 규칙들을 다시 한번 깨닫게 되었습니다.
첫째, 에지 케이스 (edge cases)가 중요합니다. 사용자 권한을 처리하는 모든 시스템에서, 모든 예기치 않은 입력은 명확한 처리 경로를 가져야 합니다. 크래싱 (Crashing)은 결코 정답이 될 수 없습니다.
둘째, 특이한 케이스들을 테스트하는 것이 필수적입니다. 모든 것이 완벽하게 작동하는 경로를 테스트하는 것만큼이나 중요합니다. 저의 회귀 테스트 (regression test)는 코드가 성장함에 따라 이 특정 동작이 실수로 깨지지 않도록 보장합니다.
셋째, 오픈 소스 (open source)는 매우 협력적입니다. Hermes 커뮤니티는 믿을 수 없을 정도로 환영하는 분위기입니다. 팀은 코드 리뷰 (code review)를 위해 AI 도구를 사용하는데, 이는 잠재적인 개선 사항을 조기에 포착할 수 있는 환상적인 방법입니다.
개발자들에게 자신의 AI 에이전트 (AI agents)에 대한 실질적인 제어권을 부여하는 오픈 소스 프로젝트에 기여할 수 있어 기쁩니다. 이러한 과제를 해결하는 것은 이러한 시스템이 내부적으로 어떻게 작동하는지 이해하는 훌륭한 방법입니다.
읽어주셔서 감사합니다. AI 에이전트를 탐구하거나 직접 기여하고 싶다면, Hermes Agent 리포지토리 (repository)를 확인해 보세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기