본문으로 건너뛰기

Playground

이 변경을 안전하게 머지할 수 있나요?

이 변경을 안전하게 머지할 수 있나요? 경로를 확인하지 않고 폴더를 삭제하면 차단되고, 경로 검사를 추가하면 위험이 낮아집니다.

이 샘플이 보여주는 것. 사람이나 에이전트 리뷰어는 머지 전에 빠른 게이트가 필요한 경우가 많습니다. 이 diff의 위험은 얼마나 되고, 데이터를 위협하는가? 이 샘플은 두 질문을 한 요청에서 합니다. risk는 네 단계 점수(위험 없음, 낮음, 높음, 머지 차단)이고 security는 예/아니오 질문입니다. "이 변경이 보안이나 데이터 안전에 영향을 주나요?"

샘플 입력과 결과(샘플 데이터, 라이브 모델 실행 아님). diff는 scripts/clean.sh를 편집해 rm -rf ./build/cache를 설정에서 읽은 경로로 바꿉니다. DIR="$(read_config cache_dir)" 다음 rm -rf "$DIR/". 컨텍스트에 따르면 cache_dir이 비어 있을 수 있고, 그때 read_config는 빈 문자열을 반환해 명령이 rm -rf "/"가 됩니다. 결과: 머지 차단, 68%(높음 27%). 보안 확률: 0.86. 한 줄 : "${DIR:?cache_dir is not set}"을 추가하면 미설정 시 루트를 지우지 않고 스크립트가 실패합니다. 결과: 낮음, 63%(높음 22%, 위험 없음 12%). 보안 확률은 0.31로 내려갑니다.

사용 방법. 출력은 리뷰 문구가 아니라 점수와 확률이므로 CI나 에이전트 루프에 바로 넣을 수 있습니다. "머지 차단" 확률이 높으면 막고, 중간 점수는 사람에게, 나머지는 통과. 임계값은 저장소 이력으로 설정하세요. 샘플 요청은 Decider(decider-v1.1)를 사용합니다.

자주 묻는 질문

diff가 위험한 이유를 설명하나요?

아니요. 점수와 확률만 반환합니다. 문장형 리뷰가 필요하면 생성 모델을 사용하세요.

위험 수준을 바꿀 수 있나요?

네. 수준은 criteria에 있으며, 각 모델의 Model info에 표시된 범위 안에서 이름을 바꾸거나 개수를 조정할 수 있습니다.

이 결과는 라이브 실행인가요?

아니요. 페이지는 선택한 모델과 무관한 샘플 데이터입니다. 자신의 diff를 점수화하려면 로그인하세요.

샘플 결과는 선택한 모델에 따라 바뀌지 않습니다.

요청

state
diff
--- a/scripts/clean.sh+++ b/scripts/clean.sh@@-rm -rf ./build/cache+DIR="$(read_config cache_dir)"+rm -rf "$DIR/"

cache_dir may be unset; read_config then returns an empty string

결과

샘플 데이터
두 예제 비교

이 두 예시는 세부 사항 하나만 다릅니다. 결과가 그에 따라 바뀝니다.

무엇이 바뀌었는지경로 검사 없음 → 경로 검사됨

이 결과는 샘플 데이터이며 라이브 모델 실행이 아닙니다. 로그인하면 자신의 콘텐츠로 시도할 수 있습니다.
risk: 1 · 낮음 → 3 · 머지 차단 security: 신뢰도 = 0.31 → 신뢰도 = 0.86
riskscore
3 · 머지 차단
옵션별 신뢰도
0 · 위험 없음
1%
1 · 낮음
4%
2 · 높음
27%
3 · 머지 차단
68%
securitynoul
신뢰도 = 0.86신뢰도

코드 복사

SYSTEM_ONE_API_KEY를 설정하세요. 스니펫은 게시된 카탈로그 모델 ID를 사용합니다.

요청 JSON
application/json
{"model":"decider-v1.1","state":{"diff":"--- a/scripts/clean.sh\n+++ b/scripts/clean.sh\n@@\n-rm -rf ./build/cache\n+DIR=\"$(read_config cache_dir)\"\n+rm -rf \"$DIR/\"","context":"cache_dir may be unset; read_config then returns an empty string"},"questions":{"risk":{"type":"score","instructions":"Rate the merge risk of this diff.","criteria":["위험 없음","낮음","높음","머지 차단"]},"security":{"type":"noul","instructions":"Does this change affect security or data safety?"}}}
cURL · POST /v1/systemone
sh
curl "https://system-one.dev/v1/systemone" \  -H "Authorization: Bearer $SYSTEM_ONE_API_KEY" \  -H 'Content-Type: application/json' \  -H 'Idempotency-Key: saved-operation-id' \  --data '{"model":"decider-v1.1","state":{"diff":"--- a/scripts/clean.sh\n+++ b/scripts/clean.sh\n@@\n-rm -rf ./build/cache\n+DIR=\"$(read_config cache_dir)\"\n+rm -rf \"$DIR/\"","context":"cache_dir may be unset; read_config then returns an empty string"},"questions":{"risk":{"type":"score","instructions":"Rate the merge risk of this diff.","criteria":["위험 없음","낮음","높음","머지 차단"]},"security":{"type":"noul","instructions":"Does this change affect security or data safety?"}}}'
TypeScript
TypeScript
// npm install @system-one-ai/core@0.8.0 @system-one-ai/adapter-system-one@0.7.0 @system-one-ai/transport-fetch@0.8.0import { createSystemOne, choice, score, booleanQuestion } from '@system-one-ai/core';import { systemOneAdapter } from '@system-one-ai/adapter-system-one';import { createFetchTransport } from '@system-one-ai/transport-fetch';const client = createSystemOne({  baseURL: "https://system-one.dev/v1",  apiKey: process.env.SYSTEM_ONE_API_KEY!,  model: "decider-v1.1",  adapter: systemOneAdapter,  transport: createFetchTransport(),  timeoutMs: 30_000,  maxRetries: 0,});const result = await client.evaluate({  state: {    "diff": "--- a/scripts/clean.sh\n+++ b/scripts/clean.sh\n@@\n-rm -rf ./build/cache\n+DIR=\"$(read_config cache_dir)\"\n+rm -rf \"$DIR/\"",    "context": "cache_dir may be unset; read_config then returns an empty string"  },  questions: {  risk: score("Rate the merge risk of this diff.", ["위험 없음", "낮음", "높음", "머지 차단"]),  security: booleanQuestion("Does this change affect security or data safety?"),  },}, { headers: { 'Idempotency-Key': crypto.randomUUID() } });result.answers.risk.scoreresult.answers.security.probabilityresult.response.requestId;