Skip to content

Closiro v2.44.0

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 30 Oct 19:41
· 1 commit to main since this release
bd2d4a6

Closiro v2.44.0

긴 작업에서 모델 응답이 잘리거나 끊겨도 실행이 엉뚱하게 끝나지 않도록 응답 처리와 비용 예약을 다시 짰습니다. 모든 모델 호출은 실제로 보내는 요청을 기준으로 미리 예약하고, 다음 요청이 예산에 들어가지 않을 때 마무리를 시작합니다.

잘린 응답과 끊긴 스트림

  • 모델별 출력 한도를 정하고 기록합니다. 출력 한도에서 잘린 응답은 답으로 받아들이지 않고 복구합니다.
  • 생각만 하다 잘린 응답은 한도를 늘리지 않고 한 번만 다시 묻습니다. 추론 강도를 한 단계 낮추고(max→xhigh→high→medium→low) 호스트 메모를 붙입니다. 다음 요청은 원래 강도로 돌아갑니다. 같은 사건에서는 한 번만 복구하고, 끊긴 스트림이나 거절에는 쓰지 않습니다.
  • HTTP 200 뒤에 끊긴 스트림("error decoding response body")은 과금 여부를 알 수 없는 오류로 분류하고, 실행당 최대 3번 같은 모델에 다시 보냅니다(2초, 4초, 8초 뒤, 매번 비용 예약을 거칩니다).
  • 도구 결과는 항상 모델에 전달되거나 종료 기록에 남습니다. 모든 루프 종료에 사유가 붙습니다.

비용 예약과 마무리

  • 모든 호출을 보내는 요청 그대로 예약합니다. 입력 전체를 캐시 쓰기 가격(×1.25)으로, 출력은 요청에 실린 한도만큼 잡습니다. 이전 응답이 5분 넘게 스트리밍되어 캐시가 만료된 경우에도 상한을 넘지 않습니다.
  • 마무리는 다음 작업 요청이 한도째로 들어가지 않을 때 시작합니다. "가장 큰 호출 × 1.5" 규칙은 없앴습니다. 마무리는 턴 사이에서만 시작하며, 보고 요청에는 마무리 안내가 함께 실려 예약됩니다.
  • 보고 호출조차 들어가지 않으면 호스트가 실행 기록으로 보고서를 씁니다(바뀐 파일, 최근 명령과 결과, 남은 확인). 모델 호출은 하지 않습니다.
  • 결과 검토 호출의 비용을 작업 비용과 따로 기록합니다. 검토를 끝낼 수 없을 때는 코딩 모델에 할 수 없는 지시를 보내지 않고 verification_unavailable로 검증 없이 끝냅니다.

셸과 프로세스

  • 자식 프로세스가 많은 명령을 Interrupted로 멈추지 않습니다.
  • 셸 실행이 끝나기 전에 받은 쓰기 요청을 처리하고, 그 실행이 나중에 바꾼 파일을 알려 줍니다.
  • 다른 호출의 중단 신호에 서비스가 같이 멈추지 않습니다. 좀비만 남은 프로세스 그룹은 끝난 것으로 봅니다.

테스트를 요구하는 요청

  • 테스트를 쓰라는 요청이면 테스트 설계 의무가 생깁니다. 상태를 바꾸는 동작마다 여섯 가지(함께 바뀌는 상태, 반대 동작, 같은 동작 반복, 경계값, 중간 실패, 동시 요청)를 따져 시나리오를 만들고, .snailer/test_obligations.json에 시나리오별 테스트와 그 테스트가 잡아야 할 코드 변경(돌연변이)을 적습니다.
  • 호스트가 테스트가 정말 그 성질을 검사하는지 확인합니다. 적힌 테스트가 실제로 있는지, 테스트 명령이 지금 코드에서 통과하는지, 돌연변이마다 실패하는지 확인합니다. 돌연변이는 하나씩 적용하고 매번 원래대로 되돌립니다. 테스트가 잡지 못한 돌연변이가 있으면 작업이 끝나지 않은 것으로 봅니다. 예: 취소를 두 번 했을 때 인원이 두 번 줄어도 통과하는 테스트는 걸러집니다.
  • 테스트 폴더 변경이 금지된 요청이면 새 테스트를 다른 폴더에 두라고 안내합니다. SNAILER_TEST_OBLIGATIONS=0으로 끌 수 있습니다.

실행이 띄운 서버

  • 정리 책임자를 정한 실행 계약 아래에서는 에이전트가 계속 실행하겠다고 띄우고 준비를 확인한 서버를 요청 문구와 관계없이 넘깁니다. "set up a server on port 8080"처럼 "keep it running"이 없는 요청에서 준비된 서버를 종료 시 꺼 버리던 문제를 고쳤습니다(Terminal-Bench 2.1 네 과제). 계약이 없는 대화형 실행은 지금처럼 아무것도 남기지 않습니다.

명령 시간 제한

  • timeout_sec은 초 단위이고 최대 21,600초(6시간)입니다. 30000처럼 밀리초로 보이는 값은 실행하지 않고 "약 8.3시간입니다. 밀리초라면 30을 쓰세요"라고 알려 줍니다. 기본 시간(600초)에 멈춘 명령에는 그 사실과 다음 방법을 붙입니다.

벤치마크 프로필

SNAILER_PROFILE=benchmark(Terminal-Bench 어댑터가 켭니다)에서만 달라지는 동작입니다. 대화형 사용은 그대로입니다.

  • 채점용 과제에 필요 없는 도구(편집기 열기, 앱 마법사, 계획 모드, 워크트리, 리서치·기억 도구)를 빼고, 시스템 프롬프트 끝에 완료 점검표를 붙입니다.
  • 시간과 예산을 25% 넘게 남기고 "완료"하면 점검표를 확인하도록 실행을 이어갑니다. 최대 3번이고, 직전 이어가기에서 아무 작업도 하지 않았으면 멈추며, 다음 요청이 비용 상한 안에 들어갈 때만 합니다.
  • 수정 금지 조건 때문에 판단할 수 없는 명령이나 쓰기는 실행을 끝내지 않고 진행합니다. 보호 파일은 끝날 때 그대로 비교합니다. 결과 검토를 할 수 없을 때도 시간이 남아 있으면 점검표 이어가기로 넘어갑니다.
  • 모델이 작업 요청을 거절하면 격리된 벤치마크 환경이라는 사실을 덧붙여 한 번만 다시 묻습니다. 다시 거절하면 끝냅니다.
  • 시간의 50%, 75%, 90%에 남은 시간을 한 줄로 알립니다.
  • 생각만 하다 잘린 응답이 복구 뒤 또 나오면, 예산이 절반 넘게 남아 있을 때 실행당 한 번 더 복구합니다.

실행 종료 사유

  • 제공자 계정의 잔액·한도 부족("credit balance is too low", insufficient_quota)은 model_error가 아닌 provider_billing으로 끝납니다.

Terminal-Bench

  • 전체 실행 스크립트가 BENCH=4.0으로 Terminal-Bench 4.0을 돌립니다. GPU, 네트워크 없는 채점, 호스트보다 많은 CPU가 필요한 과제는 모델 호출 전에 빼고 0점으로 셉니다.
  • Harbor 어댑터가 verification_unavailable(종료 코드 3)을 채점하고, 과제의 skills_dir을 받아들이며, 과제당 비용 상한 없이 돌릴 수 있습니다.
  • 실행 스크립트: 크레딧이 떨어지면 새 시행을 멈추고 재실행 목록을 남깁니다. RESUME=<이전 실행 폴더>로 실행되지 않았거나 환경 문제로 끝난 과제만 같은 빌드로 다시 돌려 한 점수로 합칩니다. 시작 전에 Mac 50 GB, Docker 20 GB 여유를 확인하고, 실행 중 공간이 모자라거나 Docker가 응답하지 않으면 멈춥니다. 과제 이미지를 미리 받고, 환경 문제로 끝난 시행은 끝난 뒤 한 번 자동으로 다시 돌립니다. aarch64 빌드 스크립트를 추가했고, TB 2.1은 aarch64 빌드 없이 시작하지 않습니다.
  • 내부 1회 실행(Opus 5.5 high, 과제당 상한 없음): TB 2.1은 에이전트가 실제로 작업한 68과제 중 53개(77.9%), 89과제 전체 기준 59.6%입니다. 나머지 21개는 API 크레딧 소진(17)과 aarch64 빌드 없음(4)으로 실행되지 않았습니다. TB 4.0은 일부만 실행했습니다(23과제 중 7개 해결).