Adapter는 provider별 message 형식, event parsing, tool result 구조처럼 wire를 알아. Orchestrator는 handler를 언제 부르고, JSONL을 언제 쓰며, loop를 언제 끝내고, hook을 언제 적용할지 알아.
loop를 Adapter 안에 숨기지 마
Adapter가 모든 것을 처리하면 간단해 보이지만 호출별 측정과 개입이 어려워져. 특정 tool call에 logging hook을 넣거나 handler 실행 전에 arguments를 검사하거나 wire와 독립적으로 loop를 replay하기 힘들어.
Orchestrator가 결정을 맡아
Adapter는 TextDelta, ToolCallRequested 같은 typed event를 yield해. Orchestrator는 ToolCallRequested를 받으면 handler를 실행하고, 결과를 다음 호출의 input으로 넣으며, on_tool_call, on_text_delta, on_done hook을 적용해.
분리된 loop는 CI에서 replay할 수 있어
Orchestrator가 loop를 맡으면 capture한 event sequence를 mock adapter로 재생해 같은 동작에 도달하는지 확인할 수 있어. 실제 provider wire를 다시 호출하지 않고 logic regression을 잡아.