Vercel의 AI 에이전트 프레임워크 eve가 Slack 채널에서 새로운 이벤트 훅과 세션 제어 기능을 제공한다. onMessage/onEvent 훅을 통해 Slack 이벤트를 유연하게 핸들링하고, 진행 중인 응답을 취소하거나 대화 세션을 초기화하는 기능도 추가됐다.
핵심 포인트- onMessage 훅에 ctx.isBotMentioned()와 ctx.isSubscribed() 헬퍼가 추가돼 멘션 없이도 스레드에서 계속 대화할 수 있다.
- ctx.cancel()은 현재 턴을 중단하면서 세션을 유지하고, ctx.reset()은 세션 전체를 종료해 다음 메시지부터 새 대화를 시작한다.
- onEvent 훅으로 Slack Events API의 모든 이벤트(reaction_added, team_join, channel_created 등)를 핸들링할 수 있다.
- ctx.thread.listParticipants()로 스레드에 참여한 유저 목록을 가져올 수 있으며, 공개/비공개 채널에 따라 필요한 Slack 봇 scope가 다르다.
- ctx.receive()를 여러 번 호출해 하나의 이벤트를 여러 채널 타깃으로 팬아웃할 수 있다.
상세 정리- 배경: 기존 Slack 채널에서는 매번 멘션이 필요했고, 진행 중인 응답을 중단하거나 대화를 완전히 새로 시작하는 기능이 없었다.
- onMessage 훅: 들어오는 Slack 메시지를 수신하며, ctx.isBotMentioned()와 ctx.isSubscribed()로 라우팅 조건을 설정한다.
- 스레드 참여자 확인: ctx.thread.listParticipants()가 first-appearance 순서로 유니크한 인간 유저 ID를 반환한다. 공개 채널은 message.channels 트리거와 channels:history scope가 필요하다.
- ctx.cancel(): 현재 실행 중인 턴을 멈추고 세션은 유지 — 새 메시지를 대체 입력으로 큐에 추가해 최신 메시지에 바로 응답하게 한다.
- ctx.reset(): 세션을 완전히 종료 — 다음 메시지부터 히스토리·상태·샌드박스가 초기화된 새 세션이 시작된다. '!new' 명령어로 신규 대화를 시작하는 예시를 TypeScript 코드로 제시한다.
- onEvent 훅: Slack Events API의 임의 이벤트를 수신한다. team_join 이벤트를 받아 여러 온보딩 채널에 동시 메시지를 보내는 패턴을 TypeScript 코드로 제시한다.
- 팬아웃 패턴: ctx.receive()를 Promise.all로 묶어 하나의 이벤트에서 여러 타깃에 동시 에이전트 턴을 시작하는 방법을 보여준다.
왜 읽나Vercel eve 에이전트 프레임워크로 Slack 봇/AI 에이전트를 구축하는 개발자에게 이벤트 기반 제어 패턴의 실전 코드 레퍼런스.