day7_practice/local_tracer.pyday7_practice/trace_run.pyday6_practice/final_scenario.py (LLMLogger)

콜백 추적: 질문 하나가 trace.jsonl 에 남기는 줄들

BaseCallbackHandler 를 상속한 FileTracer 를 실행 config 의 callbacks 에 넣으면, Supervisor → handoff → 서브 Agent → 도구 → 복귀를 지나는 동안 모델·도구 호출이 시작하고 끝날 때마다 메서드가 불려 trace.jsonl 에 한 줄씩 쌓입니다. 이벤트의 순서, run_id 로 짝을 맞추는 법, 기록되지 않는 것을 단계별로 봅니다.

한눈에 보는 구조: config 로 들어간 핸들러가 안쪽까지 따라간다

그래프 코드는 그대로 두고, 실행할 때 넘기는 config 에 tracer 를 실을 뿐입니다. 그 실행에서 파생된 모든 모델 호출과 도구 호출이 같은 핸들러의 메서드를 부릅니다.

trace_run.py await app.ainvoke( 입력, {"callbacks": [tracer]} ) build_app() 이 만든 Supervisor 그래프 supervisor 모델 호출 도구 transfer_to_* handoff 복귀 data_agent 모델 호출 도구: MCP 4종 research_agent 모델 호출 retrieve_docs general_agent 모델 호출 도구 없음 config 의 callbacks 는 하위 실행 전부로 전달됩니다 노드 실행(체인 런)과 복귀 메시지는 기록되지 않습니다 콜백 FileTracer BaseCallbackHandler 상속 on_chat_model_start llm_start on_llm_end llm_end on_tool_start tool_start on_tool_end tool_end on_llm_error llm_error on_chain_* · on_tool_error 는 없음 _write trace.jsonl ("a" 이어 쓰기) {"event": "llm_start", …} {"event": "llm_end", …} {"event": "tool_start", …} {"event": "tool_end", …}
handoff: transfer_to_… 도구 호출 (기록됨) 복귀: transfer_back_to_supervisor 메시지 쌍 (도구 실행이 아니라 기록 없음) 콜백 메서드 호출과 파일 쓰기

이 단계에서 일어나는 일

FileTracer 와 6일차 LLMLogger 비교

FileTracer (day7_practice/local_tracer.py)LLMLogger (day6_practice/final_scenario.py)
있는 곳별도 모듈. 필요할 때 바깥에서 config 로 붙임그래프 파일 안. main() 의 astream config 에 붙임
잡는 이벤트모델 시작·끝·오류 + 도구 시작·끝모델 시작·끝·오류만 (도구 메서드 없음)
형식JSONL. 한 줄에 dict 하나라 프로그램으로 세기 쉬움사람이 읽는 텍스트. 콘솔과 llm_calls.log 에 같이
내용 길이메시지·결과마다 앞 200자전문
누가 불렀나적지 않음metadata["langgraph_checkpoint_ns"] 의 앞부분 (supervisor, data_agent …)
tool_calls적지 않음 (llm_end 는 gen.text 만)입력 메시지와 출력 모두에 <tool_calls: …> 로 표시
파일 다루기쓸 때마다 "a". 실행을 거듭하면 계속 쌓임만들 때 "w" 로 비우고, 줄마다 "a". 실행마다 새로 시작
짝 맞추기run_id → time.time()run_id → (순번, perf_counter(), 누가)

원고가 짚은 대로 FileTracer 에는 호출 주체 칸이 없습니다. LLMLogger 처럼 콜백이 함께 받는 metadata 를 읽으면 같은 방법으로 보강할 수 있습니다.

함정·주의

관련 파일