생성 중단

Stop generating

응답이 스트리밍되는 도중 언제든 눌러서 그 자리에서 멈출 수 있는 버튼.

다른 이름: Cancel generationStop button
···
html
<div class="wrap">
  <div class="bubble"><span id="txt"></span><span class="caret" id="caret">▍</span></div>
  <div class="ctrl">
    <button class="stopbtn" id="btn"><svg id="icn" width="12" height="12" viewBox="0 0 24 24"><rect x="6" y="6" width="12" height="12" rx="2" fill="currentColor"/></svg></button>
    <span class="lbl" id="lbl">생성 중…</span>
  </div>
</div>
css
.wrap{width:min(290px,94%);display:grid;gap:9px}
.bubble{padding:10px 12px;border-radius:12px;border-bottom-left-radius:4px;background:var(--surface);border:1px solid var(--line);color:var(--fg);font-size:12px;line-height:1.6;min-height:20px}
.caret{color:var(--accent);animation:blink 1s step-end infinite}
.caret[data-hide]{display:none}
@keyframes blink{50%{opacity:0}}
.ctrl{display:flex;align-items:center;gap:7px}
.stopbtn{width:24px;height:24px;border-radius:50%;border:1px solid var(--line);background:var(--surface);color:var(--fg);display:grid;place-items:center;cursor:pointer}
.lbl{font-size:10.5px;color:var(--muted)}
js
const full = '분산 시스템에서 일관성과 가용성은 서로 트레이드오프 관계에 있고, 네트워크 분할이 생기면 둘 중 하나를 포기해야 하는데 이걸';
const txt = document.getElementById('txt'), caret = document.getElementById('caret'), lbl = document.getElementById('lbl');
let i = 0, timer = null, stopAt = 46;
function step() {
  txt.textContent = full.slice(0, i);
  if (i >= stopAt) { finish(true); return; }
  i++;
  timer = setTimeout(step, 34);
}
function finish(stopped) {
  clearTimeout(timer);
  caret.setAttribute('data-hide', '');
  lbl.textContent = stopped ? '중단됨' : '완료';
  setTimeout(restart, 2000);
}
function restart() {
  i = 0; stopAt = 30 + Math.floor(Math.random() * 30);
  txt.textContent = '';
  caret.removeAttribute('data-hide');
  lbl.textContent = '생성 중…';
  step();
}
step();

방향이 잘못됐거나 이미 원하는 내용이 다 나왔다면, 나머지가 끝까지 생성되는 걸 기다릴 이유가 없습니다. 정지 버튼은 전송 버튼이 있던 자리를 그대로 대체해서(네모 아이콘으로) 나타나므로, 사용자는 버튼 위치를 다시 찾을 필요 없이 같은 자리를 누르면 됩니다.

누르는 즉시 스트리밍이 멈추고, 지금까지 나온 텍스트는 그대로 남습니다 — 통째로 취소해서 없애버리지 않습니다. 응답 끝에 "중단됨" 같은 짧은 표시를 남기면, 이 답이 완결된 게 아니라 사용자가 스스로 멈춘 것이라는 맥락이 이후에도 남습니다.

서버 쪽에서도 실제로 생성을 중단해야 합니다 — 버튼만 멈춘 것처럼 보이고 모델은 뒤에서 계속 토큰을 만들고 있다면 비용과 자원이 그대로 낭비됩니다.

언제 쓰나

스트리밍 응답이 있는 모든 인터페이스의 기본 통제 수단으로 둡니다. 응답이 즉시 완성돼 스트리밍 구간이 사실상 없다면 필요 없습니다.