GPT‑6.1 Sol 도구 호출 오류 해결: Responses로 전체 루프 이전하기

Sol의 엔드포인트와 추론 설정부터 인수 검증, call_id 반환, 상태 보존, 종료 조건까지 점검합니다. 실행 가능한 Python 예제와 오프라인 테스트를 제공합니다.

따뜻한 회색 배경의 스텐실 판 선화와 GPT-6.1 Sol Tools 제목.

모델 이름을 gpt-6.1-sol로 바꾼 뒤 도구가 작동하지 않으면 프롬프트보다 엔드포인트를 먼저 확인하세요. Sol 도구 호출에는 Responses API가 필요하며 Chat Completions는 도구 없는 요청만 지원합니다. none, minimal 추론 수준도 지원하지 않습니다. 이름만 교체하면 이전의 비호환 요청이 남을 수 있습니다.

이 글은 읽기 전용 재고 조회로 요청, 함수 실행, 결과 반환을 끝까지 연결합니다. 다운로드 파일에는 합성 응답을 이용한 오프라인 테스트가 있습니다. 앱 로직을 검증하는 것이며 유료 API 시험이나 모델 성능 측정은 아닙니다. 2026년 9월 30일 모델 문서, 이전 가이드, 함수 호출 문서를 확인했습니다.

실패한 단계를 먼저 구분하기

클라이언트가 요청을 만들고 API가 구조화된 호출을 반환하면 앱이 허용된 함수를 실행한 뒤 결과를 모델에 돌려줍니다. “도구가 안 된다”만으로는 네 단계 중 어디가 문제인지 알 수 없습니다.

증상먼저 확인할 곳대응
출력 전에 거절엔드포인트·필드Responses와 호환 필드 사용
호출 없이 문장만 출력tools 전달, 지시, 도구 선택텍스트뿐 아니라 구조화 output 확인
호출은 있지만 실행 없음앱 디스패처허용 목록 함수 실행
다음 턴에 결과 연결 실패call_id·이력원래 항목과 ID 보존
반복 호출로 끝나지 않음도구 오류·누락·라운드 제한명시적 오류와 종료 경계
결과 없이 완료 표시성공 조건실행 증거 필수화

원인을 분류하기 전 반복 재시도하지 마세요. 지원하지 않는 필드는 다섯 번째에도 지원하지 않습니다. 인증 실패와 속도 제한도 다른 처리가 필요합니다.

도구에 Responses를 사용하라는 Sol 공식 문서

실제 영문 문서 화면으로 API 제한을 확인한 것입니다. 재고 함수 실행 화면은 아닙니다.

모델 이름뿐 아니라 요청 구조도 변경하기

Responses 함수는 속성을 도구 객체 바로 아래 둡니다. Chat Completions의 function 래퍼를 그대로 옮기면 안 됩니다.

tool = {
    "type": "function",
    "name": "lookup_stock",
    "description": "Read stock for one known product SKU.",
    "parameters": {
        "type": "object",
        "properties": {"sku": {"type": "string"}},
        "required": ["sku"],
        "additionalProperties": False,
    },
    "strict": True,
}

최소 요청에는 client.responses.create, input, reasoning={"effort":"medium"}, 적절한 max_output_tokens를 사용합니다. Sol은 low, medium, high, xhigh, max를 지원합니다. 제품 UI의 Ultra를 API 값으로 쓰지 마세요.

현재 이전 가이드는 이 추론 요청에서 호환되지 않는 temperature, top_p, top_logprobs 및 해당 출력 log probabilities 요청을 제거하도록 설명합니다. SDK나 프록시가 기본값을 넣을 수도 있으므로 오류가 특정 필드를 지목하면 최종 요청 설정을 봐야 합니다. 모델 이름 근처 코드만 보지 말고 엔드포인트, 모델, 필드 이름, 상태, 요청 ID를 비밀 정보 없이 기록하세요.

읽기 전용 전체 예제 실행

tool_loop.py 다운로드. 스키마, 가상 상품 두 개, 인수 검증, 허용 목록 디스패처, 유한 루프와 테스트가 들어 있습니다. 실제 사업 재고가 아니라 교육 데이터입니다.

Python 3.9 이상에서 먼저 실행합니다.

python3 tool_loop.py --self-test

예상 결과는 offline checks passed입니다. 표준 라이브러리만 사용하고 키를 읽거나 클라이언트를 설치하거나 통신하지 않습니다. 정상 왕복, 잘못된 JSON·인수, 미등록 함수·SKU, 미완료 응답, 라운드 초과와 잘못된 성공 판정을 검사합니다.

자신의 승인된 API 프로젝트에서 유료 실행하려면 별도 환경을 만듭니다.

python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade openai
# OPENAI_API_KEY를 환경에 설정하고 저장소에 커밋하지 마세요.
python tool_loop.py --live

--live는 API 사용량을 발생시키며 모델 접근 권한이 필요합니다. 이 글에서는 실행하지 않았습니다. 스크립트는 공식 OpenAI URL을 명시해 다른 base URL 환경 설정에 의해 경로가 바뀌지 않도록 합니다. DEMO-A의 교육용 재고는 12개입니다. 실제 lookup_stock 호출, 연결된 결과, 12와 일치하는 최종 답변이 있어야 합니다. 유창한 문장만으로는 성공이 아닙니다.

실행한 SDK 버전도 남기세요. 설치 명령이 현재 공식 패키지를 받는다는 뜻이지, 그 환경에 대해 여기서 유료 통합 테스트를 완료했다는 뜻은 아닙니다.

response.output과 정확한 call_id 보존

루프의 중요한 부분은 다음과 같습니다.

history.extend(response.output)
for call in calls:
    result = dispatch(call.name, call.arguments)
    history.append({
        "type": "function_call_output",
        "call_id": call.call_id,
        "output": json.dumps(result),
    })

프로토콜에 필요한 추론 항목까지 response.output 전체를 보존합니다. 텍스트는 응답 일부이므로 response.output_text만으로 이력을 재구성하면 안 됩니다. 여러 호출이면 각각의 원래 ID로 결과를 반환하고 함수 이름이나 새로 만든 ID로 대체하지 않습니다.

예제는 누적 이력을 다시 보내며 previous_response_id를 함께 넣지 않습니다. 문서화된 상태 참조 방식도 가능하지만 서버에 무엇이 저장됐는지 모른 채 전체 재전송과 섞으면 문맥을 중복할 수 있습니다. 한 방식을 선택하고 다음 입력을 확인하세요.

마지막 응답에 호출이 없으면 완료 상태, 비어 있지 않은 텍스트, 앞서 얻은 올바른 DEMO-A=12 조회 결과가 필요합니다. 미등록 도구나 SKU는 성공 조건이 아닙니다. 다만 자연어 답변이 재고와 맞는지는 별도 검수해야 합니다. 거절, 미완료, 통신 실패, 빈 출력은 완료 메시지로 바꾸지 않습니다.

실행 전 검증과 권한은 앱 책임

엄격한 스키마는 인수 제약을 돕지만 서버 검증이나 실행 권한을 대신하지 않습니다. 디스패처는 JSON을 파싱하고 문자열 sku 하나만 허용하며 함수 이름을 검사합니다. 상품이 없으면 구조화된 unknown_sku를 반환합니다. 모델이 만든 셸 명령를 실행하거나 도구 텍스트를 새 명령으로 취급하지 않습니다.

교육 예제는 작은 오류 객체를 다음 턴에 전달합니다. 실제 서비스는 오류 분류를 기록하고 같은 잘못된 행동이 반복되면 멈춰야 합니다. 전체 데이터베이스나 비공개 예외 추적 정보을 보내지 말고 필요한 결과만 전달하세요.

쓰기 작업은 별도 설계가 필요합니다. 타임아웃이 나도 서버는 이미 실행했을 수 있어 재시도가 중복 작업을 만들 수 있습니다. 결제·삭제·배포에는 작업 ID, 지속 상태, 적절한 승인 규칙이 필요합니다. 예제는 프로토콜 학습을 위해 읽기 전용으로 제한하며 쓰기 권한 문제를 모두 해결했다고 주장하지 않습니다.

시간·라운드·금액을 각각 제한하기

스크립트는 모델 라운드 수를 제한하고 실제 API 호출 경로에 SDK 타임아웃과 자동 재시도 비활성화를 적용합니다. 실패를 드러내기 위한 교육 기본값이며 모든 서비스의 권장값은 아닙니다.

라운드 제한은 금액 제한이 아닙니다. 매 요청의 입출력이 다르고 이력이 긴 요금 구간으로 넘어갈 수 있습니다. 서비스로 만들 때는 비용 계산 가이드의 요청 장부와 예산 제한을 추가하세요.

일시적인 통신·속도 제한 오류는 잔여 예산 안에서 재시도 간격을 늘리는 방식으로 재시도할 수 있습니다. 잘못된 필드, 미지원 엔드포인트, 권한 부족은 원인을 먼저 고칩니다. 도구 타임아웃에서 재고를 추측하지 말고, 라운드 초과는 미완료로 표시하며 진단 ID를 남깁니다.

기존 경로 교체 전 검수

격리 프로젝트에서 실제 Responses 경로와 모델 ID, 구조화 호출, 허용 함수 실행, 원래 항목과 일치하는 결과 ID가 담긴 다음 요청, 교육 값과 맞는 답변을 확인하세요. 오프라인의 의도적 실패도 통합 시험에 포함합니다.

모델·엔드포인트 설정을 되돌릴 수 있게 남기고 같은 작업으로 비교합니다. 동시에 프롬프트·도구·권한까지 바꾸면 회귀 원인을 찾기 어렵습니다. 영문 업그레이드 가이드는 전체 이전 결정, Codex 접근 안내는 제품 클라이언트를 다룹니다. 자체 API 루프 검증을 대신하지 않습니다.