콘텐츠로 이동

이벤트 받기

CLI가 말하는 모든 것은 AbstractEvent 하위 클래스로 도착합니다.

import { AssistantEvent, ResultEvent, SystemEvent } from 'activecli';
command.subscribe((event) => {
if (event instanceof AssistantEvent && event.hasText()) {
process.stdout.write(event.text);
}
if (event instanceof ResultEvent) {
console.log('turn finished:', event.raw['subtype']);
}
});

AssistantEvent.text는 그러지 않았다면 모든 호출자가 손으로 써야 했을 message.content 순회입니다 — CLI는 텍스트를 그 안에 블록 배열로 중첩해 넣고, 그중 일부만이 텍스트입니다. 어시스턴트가 도구만 호출했을 때는 비어 있는데, 이는 정상이며 어시스턴트가 아무 말도 하지 않은 것과는 다릅니다.

  • 모델링되지 않은 항목도 도착합니다. 라이브러리에 대응하는 클래스가 없는 항목 타입은 버려지는 대신 GenericEvent가 됩니다. 그래서 이 라이브러리보다 앞서 나간 CLI가 있어도 이벤트가 조용히 사라지지 않습니다.
  • 프로토콜이 아닌 출력은 실패가 아니라 건너뜁니다. CLI들은 경고를 프로토콜과 같은 스트림에 씁니다. JSON이 아닌 줄은 그냥 지나칩니다.

모든 이벤트는 CLI의 원본 항목을 raw 아래에 그대로 보관합니다. 어떤 필드도 제거되거나 이름이 바뀌지 않습니다.

command.subscribe((event) => {
const unknown = event.raw['unknown_future_field']; // 그대로 남아 있음
});

GenericEvent가 단지 “치명적이지 않은” 수준을 넘어 쓸모 있는 이유가 바로 이것입니다. 라이브러리가 모델링하지 않은 항목이라도, 그것을 이해하는 호출자는 여전히 온전히 읽을 수 있습니다.