기능

성과 규칙

세션이 한 일 가운데 무엇을 성과로 셀지 정하고, 판정에 무엇이 나가고 얼마가 드는지

성과 규칙은 세션이 한 일 가운데 무엇을 성과로 셀지 워크스페이스가 정하는 설정이다. 플랫폼은 세션이 실제로 한 일(근거)을 기록하고, 규칙에 맞는 근거를 성과로 남긴다. 성과는 세션 상세의 성과물 탭과 사이드바 "성과" 화면에 보인다. 성과물은 세션이 남긴 모든 것(성과, 근거인 PR·리뷰, out/ 파일, GitHub 작업)이고, 성과는 그 가운데 규칙으로 판정한 것이다.

근거와 성과

근거는 플랫폼이 직접 본 사실이고, 성과는 규칙에 맞은 근거다. 근거 종류는 코드에 고정되어 있어 사람이 더할 수 없다.

근거 종류무엇성과가 되면
PR (github_pull_request)세션이 연 PR. 열림·머지 같은 상태가 바뀌면 근거도 바뀐다바로 집계
리뷰 (github_review)세션이 낸 PR 리뷰바로 집계
out/ 파일 (out_file)세션이 마지막 checkpoint의 out/에 남긴 파일사람이 확인해야 집계
대화 (conversation)세션 대화사람이 확인해야 집계

out/ 파일과 대화는 에이전트가 쓴 글이라서 사람이 확인하기 전에는 집계에 들지 않는다. 성과를 직접 만드는 API는 없다. 사람은 확인하거나 거절만 한다.

구분, 성과 type, 규칙

콘솔의 설정 > 워크스페이스 > 성과 규칙에서 정한다. 워크스페이스 owner와 admin만 고칠 수 있고, 다른 구성원은 읽기만 한다.

  • 구분은 규칙을 묶는 대분류다. 이름은 1~32자이고, 바꾸면 지난 성과도 새 이름 아래 보인다. 사용 중인 규칙이 남은 구분은 보관할 수 없다.
  • 성과 type은 성과의 종류다. 내장 type 셋(pull_request, code_review, document)이 있고, 사람이 더 만들 수 있다. 사람이 만든 type은 이름, key, 근거 종류 하나로 이루어지고, 그 성과는 제목·링크·근거 종류·근거 id만 갖는다. key와 근거 종류는 만든 뒤 바꿀 수 없다. 워크스페이스당 보관하지 않은 type은 50개까지다.
  • 규칙은 구분 아래 한 줄이고 제목 하나, 성과 type 하나, 성과 정의 하나를 갖는다. 성과 type 하나는 사용 중인 규칙 하나에만 쓴다. 다른 정의가 필요하면 type을 새로 만든다. 사용 중인 규칙은 워크스페이스당 30개까지다.

규칙을 고치면 새 버전이 생긴다. 이미 센 성과는 그때의 버전을 가리킨 채 남는다. "머지된 PR만"처럼 근거의 상태에 따른 조건은 성과 정의 문장에 쓴다.

바로 인정과 Luna 판정

규칙마다 판정 방식을 고른다.

판정 방식하는 일비용
바로 인정 (always)그 근거 종류의 근거가 처음 생기면 조건 없이 센다없음
Luna 판정 (luna)Luna(OpenAI Decisions API, gpt-6-luna)에 성과 정의와 근거를 보내 "예"의 확률을 받는다. 확률이 문턱(기본 0.9) 이상이면 센다판정마다

Luna는 글을 만들지 않고 yes·no와 그 확률만 답한다. 확률은 성과에 "정의에 맞을 확률"로 남는다. 근거가 바뀌면(PR이 머지되면) 그 세션의 Luna 짝을 모두 다시 묻는다. 묻는 내용 전체(규칙 버전, 근거, 문턱)가 직전 판정과 같으면 보내지 않는다. 확인하거나 거절한 성과는 다시 판정해도 바뀌지 않는다.

Luna 판정에는 운영자가 더한 openai_decisions 연결이 필요하다. 지금은 연결을 저장하는 기능이 아직 들어오지 않아, Luna 규칙은 판정하지 않고 "판정기 없음"으로 남는다. 바로 인정 규칙은 연결 없이 돈다.

판정 시점과 한도

설정 > 워크스페이스 > 성과 규칙의 판정 설정 카드에서 정한다. 근거가 없는 세션은 판정하지 않는다. 판정은 마지막 계기에서 2분이 지난 뒤 돌고, 판정기는 30초마다 일을 집는다. 그래서 성과는 보통 계기가 생기고 2~3분 뒤에 보인다.

설정기본값뜻
근거가 생기거나 바뀔 때켬PR 열림·머지, 리뷰 제출, out/ 파일
N턴마다끔켜면 5~100턴마다. 대화 근거 type의 규칙이 있을 때만 의미가 있다
세션이 멈출 때끔대기·일시정지·종료 때 한 번
대화 보내기최근 20턴대화 근거 규칙에 보낼 대화. 보내지 않음 또는 최근 20턴(최대 16,000토큰, 도구 결과 제외)
하루 예산$1워크스페이스의 하루 Luna 판정 비용 상한. 넘으면 그날 Luna 판정은 다음 날(UTC 0시)로 미룬다. 바로 인정 규칙은 그때도 센다
세션당 최대20회세션 하나에서 Luna를 부른 판정의 횟수 상한. 바로 인정 규칙은 세지 않는다

판정이 실패하면(오류, 10초 시간 초과, 응답 모양 오류) 1분, 5분, 30분 뒤 세 번까지 다시 한다. 그래도 실패하면 세션 상세에 이유가 보인다. owner와 admin은 세션 상세에서 다시 판정할 수 있다. 규칙을 고쳐도 지난 세션을 저절로 다시 판정하지는 않는다.

OpenAI로 나가는 데이터

Luna 판정 규칙만 OpenAI로 데이터를 보낸다. 규칙 하나와 근거 하나를 짝지어 짝마다 질문 하나를 보낸다. 규칙은 자기 type의 근거 종류에만 짝지어진다.

근거 종류보내는 것
PR성과 정의, 저장소, 번호, 상태, 머지 시각, 변경 줄 수, PR 제목(200자)
리뷰성과 정의, 저장소, 번호, 리뷰 event
out/ 파일성과 정의, 경로, 크기, 파일 앞 2,000자
대화성과 정의, 최근 20턴 발췌(최대 16,000토큰, 도구 결과 제외). 대화 보내기가 "보내지 않음"이면 보내지 않는다
  • PR 본문과 리뷰 본문은 보내지 않는다. 리뷰 본문은 저장하지도 않는다.
  • PR 제목, 파일 내용, 대화는 누구든 쓸 수 있는 글이라 "믿지 않는 입력"으로 표시해 보낸다. 판정기가 속아도 바뀌는 것은 그 짝 하나의 예·아니오뿐이고, 성과의 제목·링크 같은 칸은 플랫폼이 근거에서 채운다.
  • 요청은 egress proxy를 지나고, 연결의 키는 proxy만 붙인다.

비용

Luna 가격은 입력 100만 토큰당 $0.10이고 출력은 무료다.

근거짝 하나의 입력짝 하나
PR·리뷰 요약약 600토큰약 $0.00006
파일 앞 2,000자약 1,200토큰약 $0.00012
최근 대화 발췌약 16,500토큰약 $0.00165

판정 한 번(PR·리뷰 근거, 짝 넷)은 약 $0.00025다. 기본 하루 예산 $1이면 이런 판정을 약 4,000번 한다.

판정 비용은 세션 비용과 따로 센다. 성과 화면의 "성과당 비용"은 기간 안 모든 세션 비용을 집계되는 성과 수로 나눈 값이다. 성과가 없는 세션의 비용도 들어가고, 판정 비용은 들어가지 않는다.

권한

하는 일누가
구분·성과 type·규칙·판정 설정 읽기워크스페이스 구성원
구분·성과 type·규칙·판정 설정 고치기, 세션 다시 판정owner, admin
성과 확인·거절owner, admin, 그 에이전트의 관리자
판정 비용과 지난 30일 수 보기(설정 화면)워크스페이스 전체 사용량을 읽을 수 있는 사람(owner)

규칙과 판정 설정을 고치는 API, 성과 확인·거절, 세션 다시 판정은 API key로 부를 수 없고 사람의 웹 로그인 cookie로만 부른다. 확인·거절과 다시 판정에는 그 세션을 읽을 권한도 있어야 한다. 고칠 때마다 receipt가 남고, 성과 정의 본문은 receipt에 싣지 않는다.

API로 성과 읽기

세션 하나의 성과는 sessions:read key로 읽는다.

curl -sS "$API/v1/sessions/$SESSION_ID/achievements" -H "Authorization: Bearer $KEY" \
  | jq -c '.items[] | {title, judge, review_state}'
{"title":"JeongJaeSoon/werft-sandbox#33","judge":"always","review_state":"auto"}

기간 안 성과 수와 성과당 비용은 GET /v1/usage/achievements로 읽는다. 범위 규칙은 GET /v1/usage/summary와 같다.

curl -sS "$API/v1/usage/achievements?scope=me&since=$SINCE" -H "Authorization: Bearer $KEY" \
  | jq -c '{achievement_count, needs_review_count, cost_usd, cost_per_achievement_usd, judge_cost_usd}'
{"achievement_count":1,"needs_review_count":0,"cost_usd":"0.000105","cost_per_achievement_usd":"0.000105","judge_cost_usd":"0.000000"}

레퍼런스: GET /v1/sessions/{id}/achievements, GET /v1/usage/achievements, GET /v1/achievement-rules

이 페이지