INVALID_CHAT_HISTORY 오류

INVALID_CHAT_HISTORY 오류

에이전트를 만들고 실행하다 보면 가끔 INVALID_CHAT_HISTORY 오류를 만날 수 있어요. 이름만 봐도 "대화 기록이 이상하다"는 뜻인데, 정확히 언제 발생하는지 이해하면 고치기도 쉬워져요.

출처: 공식문서 - INVALID_CHAT_HISTORY

이 오류는 미리 만들어진 create_agent에서 call_model 그래프 노드가 형식이 잘못된 메시지 목록을 받았을 때 발생해요. 구체적으로는 tool_calls(LLM이 도구 호출을 요청하는 것)를 가진 AIMessage인데, 그에 대응하는 ToolMessage(도구 호출의 결과를 LLM에게 돌려주는 메시지)가 없을 때가 그런 경우예요.

왜 발생하나요

이 오류가 보이는 이유는 크게 두 가지가 있어요.

  1. 그래프를 호출할 때 직접 형식이 잘못된 메시지 목록을 넘긴 경우, 예를 들어 graph.invoke({'messages': [AIMessage(..., tool_calls=[...])]})
  2. 그래프가 tools 노드로부터 업데이트(ToolMessage 목록)를 받기 전에 중단(interrupt)됐는데, 그 후 None도 아니고 ToolMessage도 아닌 입력으로 다시 호출한 경우. 예를 들어 graph.invoke({'messages': [HumanMessage(...)]}, config)처럼요.

중단은 다음 두 가지 방식으로 생길 수 있어요.

  • create_agent에서 interrupt_before = ['tools']를 직접 설정
  • 도구 중 하나가 ToolNode("tools")가 처리하지 못한 오류를 발생시킴

해결하기

다음 중 하나를 하면 해결돼요.

  1. 형식이 잘못된 메시지 목록으로 그래프를 호출하지 않기
  2. 중단(수동이든 오류든)이 발생한 경우:
  • 기존 도구 호출과 일치하는 ToolMessage를 제공하고 graph.invoke({'messages': [ToolMessage(...)]})로 호출하기. 참고: 이렇게 하면 메시지가 기록에 추가되고 그래프가 START 노드부터 다시 실행돼요.
  • 상태를 직접 업데이트하고 중단 지점에서 그래프를 재개하기:
    1. graph.get_state(config)로 그래프 상태에서 가장 최근 메시지 목록을 가져오기
    2. 메시지 목록을 수정해서 AIMessages에서 답이 없는 도구 호출을 제거하거나, 답이 없는 도구 호출과 tool_call_ids가 일치하는 ToolMessage 객체를 추가하기
    3. 수정한 메시지 목록으로 graph.update_state(config, {'messages': ...}) 호출하기
    4. graph.invoke(None, config) 같은 방식으로 그래프를 재개하기

더 알아보기 (Learn more)