fynk가 자체 AI 채팅 1만1000줄을 CopilotKit으로 대체했다

Hacker News2026-11-03

계약 관리 SaaS를 만드는 fynk가 자사 앱에 넣은 AI 어시스턴트를 오픈소스 CopilotKit과 AG-UI 프로토콜 기반으로 다시 구현했다. 그 과정에서 직접 유지하던 채팅 관련 코드 약 1만1000줄이 사라졌다. 2026년 8월 공개된 이 어시스턴트는 계약서 내용에 대한 질의응답뿐 아니라 계약 간 비교, 문서 생성과 태그 지정, 이동까지 한 에이전트 안에서 처리한다.

문제는 기존 채팅의 확장성이었다. 2026년 초 버전은 한 번에 문서 하나만 다룰 수 있었고, 서버가 내려주는 메시지는 회사가 직접 정의한 형식이었다. 답변 텍스트 한 조각과 PDF 좌표를 담는 필드가 전부였기 때문에, 계약 두 건을 비교하려면 포맷을 늘려야 했고 표를 보여주려면 프런트엔드에 새 메시지 타입을 추가해야 했다. 에이전트가 "이 문서를 열어드릴까요"라고 되묻는 기능 하나에도 수작업 상태 머신과 WebSocket 처리가 따라붙었다. 기능을 하나 낼 때마다 앱과 AI 서비스 양쪽을 동시에 고쳐야 하는 구조였다.

fynk가 눈을 돌린 곳은 AG-UI, 즉 에이전트와 사용자 인터페이스가 대화하는 방식을 정의한 공개 프로토콜이다. 텍스트, 도구 호출, 상태 갱신, 사용자 입력 대기 같은 동작을 타입이 붙은 이벤트 스트림으로 흘려보내고, 어떤 에이전트 프레임워크가 만든 출력이든 이 규격만 맞으면 동일한 UI가 렌더링할 수 있다. 응답 한 줄은 RUN_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT, TEXT_MESSAGE_END, RUN_FINISHED 같은 이벤트 조합으로 표현된다. 같은 스트림에 TOOL_CALL_START나 STATE_SNAPSHOT을 얹으면 비교 질의나 다중 문서 참조도 포맷 변경 없이 처리된다.

구성은 역할이 분리돼 있다. 에이전트 실행은 오픈소스 LangGraph가 맡고, AG-UI 어댑터가 그 출력물을 표준 이벤트로 변환한다. 스레드와 대화 이력은 fynk 자체 백엔드에 남고, 프런트엔드는 CopilotKit으로 이벤트를 그린다. 즉 대화 데이터의 소유권은 서비스에 두면서 화면과 프로토콜 계층만 표준에 위임한 셈이다.

걸림돌은 생태계였다. CopilotKit은 React 전용이었고 fynk의 앱은 Vue로 작성돼 있었다. 포크해서 혼자 관리하거나, 기능이 나올 때까지 기다리거나, 직접 붙여서 프로젝트에 기여하는 세 갈래 중에서 이들은 세 번째를 택했다. 엔지니어 Abel Enekes가 2026년 2월에 시작한 작업은 244개 파일, 6만2517줄 규모의 풀 리퀘스트로 커졌다. CopilotKit의 React 테스트 스위트를 기준으로 테스트를 먼저 작성하는 방식이었고, 메인테이너 리뷰를 거쳐 5월 13일 머지됐다. 같은 날 저녁 @copilotkit/vue 패키지가 npm에 올라갔다.

진짜 이득은 머지 이후에 나왔다. 이후 CopilotKit 팀과 다른 기여자들이 스레드 드로어, 문서화, 휴먼 인 더 루프 관련 수정, 접근성 개선 등 20건이 넘는 Vue 관련 변경을 내놨고, fynk는 이를 공짜로 받았다. Enekes도 추가로 5건의 PR을 머지했다. 포크를 유지했다면 전부 직접 감당했어야 할 몫이다. 첫 커밋부터 머지까지 약 3개월, 문서화 완료까지 8개월이 걸렸고, 25~30명 규모 회사가 한 명의 엔지니어와 코딩 에이전트로 해낸 결과였다.

개발자 입장에서 이 사례가 주는 신호는 명확하다. 앱 안에 에이전트를 넣는 일에서 어려운 부분, 그러니까 스트리밍, 도구 호출 표시, 상태 동기화, 사람 개입 지점 처리는 제품마다 똑같다. 이걸 자체 메시지 포맷으로 계속 밀어붙이면 기능 하나가 포맷 변경, 프런트 변경, 서비스 변경을 연쇄적으로 요구한다. 반대로 프로토콜 계층을 표준에 맡기면 에이전트 프레임워크를 갈아치우거나 UI를 바꾸는 결정이 훨씬 가벼워진다. 대신 프런트엔드 프레임워크 지원 여부가 실질적인 진입 장벽이 되는데, Vue 진영에는 이 사례를 통해 그 문이 열렸다.

비용도 분명히 있다. 기여는 자기 제품과 상류 프로젝트 리뷰라는 두 전선을 동시에 뛰는 일이고, 이미 고객이 쓰던 대화 이력을 새 구조로 옮기는 마이그레이션도 별도의 실제 작업으로 남았다. fynk 팀이 의외라고 짚은 지점은 노력이 쓰인 위치로, 상당한 시간이 에이전트에게 무엇을 시킬지 정의하고 그 결과를 검증하는 쪽으로 흘러갔다고 한다. 코드를 줄이는 일과 에이전트를 길들이는 일은 별개의 문제라는 뜻이다.