HTTP 성공 후 툴 호출 테스트하기
요약
본 글은 HTTP 200 응답이 항상 올바른 툴 호출을 의미하지 않는 프로토콜 오류 가능성을 지적합니다. 이를 검증하기 위해 Python CLI 'toolcall-check'를 개발했으며, 이 도구는 강제 에코, 중첩 JSON, 스트리밍 등 다양한 시나리오에서 툴 호출의 정확한 동작을 테스트하는 다섯 가지 프로브를 실행합니다.
핵심 포인트
- HTTP 200만으로는 올바른 툴 호출 여부를 확신할 수 없습니다.
- toolcall-check는 강제 에코, 중첩 JSON 등 다양한 오류 시나리오를 검증합니다.
- 스트리밍 응답의 경우 UTF-8 조각화, 주석 처리 등을 고려한 정교한 파싱이 필요합니다.
- 본 도구는 실제 모델이나 서빙 스택의 성능을 보여주기보다 체크 로직 자체를 검증하는 데 중점을 둡니다.
HTTP 200이 클라이언트가 올바른 툴 호출을 받았다는 것을 의미하지는 않습니다. 중첩된 정수(integer)는 문자열로 도착할 수 있고, 스트리밍 호출은 일부 조각(fragment)을 잃어버릴 수 있으며, 나중의 어시스턴트 턴(assistant turn)에서는 툴 결과(tool result)를 무시할 수도 있습니다. 이러한 프로토콜 오류에 대한 추적(trace)은 까다로울 수 있습니다.
저는 채팅 완료 호환 엔드포인트에서 이러한 동작을 확인하는 Python CLI인 toolcall-check를 만들었습니다. 이 도구는 다섯 가지 프로브를 실행합니다: 강제 에코 호출, 강제 중첩 JSON 호출, 두 방식의 스트리밍 버전, 그리고 2턴(two turn) 에코 왕복 테스트입니다. 이 왕복 테스트는 첫 번째 호출을 검증하고, 로컬 툴 결과로 임의의 센티넬(sentinel) 값을 반환한 다음, 다음 어시스턴트 메시지가 이를 정확히 일치하는지 확인합니다. 생성된 도구들은 실행되지 않습니다.

보고서가 확인하는 것들
중첩 페이로드(nested payload)는 정수, 부울(boolean), 실수(decimal number), 리스트, 그리고 정확한 객체 키를 포함합니다. 비교 검사는 값과 JSON 타입을 모두 확인하므로, true, 1, 1.0은 여전히 다르게 취급됩니다. 스트리밍 응답의 경우, 파서는 조각화된 UTF-8, CRLF, 주석(comments), 여러 줄 데이터 필드, 그리고 선택(choice) 및 호출 인덱스(call index)로 키가 지정된 툴 호출 델타를 처리합니다. 이는 tool_calls 종료 사유(finish reason)와 [DONE] 마커를 요구합니다. 중복 JSON 키와 비유한정 값(nonfinite values)은 유효성 검사에 실패합니다.
각 프로브는 고유의 결과와 경계가 지정된 요청 추적을 가집니다. HTTP 워커는 폐기 가능한 서브프로세스에서 실행되며, 부모 벽 시간 제한(parent wall time limit)은 느린 DNS, 느린 헤더, 그리고 점진적인 응답(trickle responses)을 포괄합니다. 리디렉션은 거부되고, 응답 본문에는 바이트 제한이 있으며, 인증 헤더는 추적에 저장되지 않습니다. 보고서는 이스케이프된 증거와 스크립트나 외부 요청이 없는 자체 포함 HTML 파일입니다. 비밀 정보(Secrets)는 최선의 노력으로 마스킹되므로, 공유하기 전에 보고서를 검사하십시오.
합성 데모는 오직 보고서 데모일 뿐입니다.
내장된 fixture는 실제 HTTP 클라이언트를 사용하고 엔드포인트 실행과 동일한 아티팩트를 작성하지만, 응답은 합성적입니다. 이 fixture가 통과했다는 것은 checker와 report path가 작동한다는 것을 의미합니다. 이는 원격 모델이나 서빙 스택이 이러한 검사를 통과하는지 여부는 보여주지 않습니다.
CompatCanary는 이미 강제 호출(forced calls), 스트리밍(streaming), 구조화된 출력(structured output)을 포함하는 더 광범위한 API 호환성 스캔을 문서화하고 있습니다. 저는 이 프로젝트를 중첩 인자 무결성(nested argument integrity), 스트림 조각 재구성(streamed fragment reconstruction), 고정 결과의 두 번째 턴(fixed result second turn), 그리고 검사 가능한 추적(inspectable traces)에 초점을 맞추었습니다. 아직 프로브(probes)를 원격 모델과 비교하여 유효성을 검증하지는 않았습니다.
이 프로젝트는 런타임 의존성이 없습니다. 새로운 private 디렉토리에 report.html, results.json, 그리고 trace.json을 작성합니다. 저는 엄격한 스트림 마커(strict stream markers), 지원되어야 할 응답 형태(response shapes), 그리고 확인해 볼 만한 로컬 엔드포인트에 대한 피드백을 받고 싶습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기