server: 제어 엔드포인트를 통한 실시간 추론 중단 ([#23971](https://github.com/ggml-org/llama.cpp/p
요약
llama.cpp 서버에 실시간 추론 중단 기능을 위한 제어 엔드포인트를 도입했습니다. TOCTOU 문제를 방지하기 위해 슬롯 ID 대신 채팅 완료 ID를 사용하여 추론 제어의 정확성을 높였으며, UI에서 사고 단계(thinking phase)를 추적할 수 있는 기능을 추가했습니다.
핵심 포인트
- POST /v1/chat/completions/control 엔드포인트를 통한 실시간 추론 중단 지원
- TOCTOU 방지를 위해 슬롯 ID 대신 completion ID 기반 타겟팅 적용
- UI에서 isReasoning 상태를 통해 사고 단계(thinking phase) 시각화
- 제어 프로토콜의 안정성을 위해 API 엔드포인트 및 액션 상수화
server: 제어 엔드포인트를 통한 실시간 추론 중단 (#23971)
- server: 제어 엔드포인트를 통한 실시간 추론 중단
#23949의 수동 추론 예산 트리거 (manual reasoning budget trigger) 기능을 기반으로 합니다. 라이브 슬롯 (live slot)에서 CANCEL 경로를 미러링하는 CONTROL 태스크를 추가하며, 생성 중간에 사고를 종료하기 위해 common_sampler_reasoning_budget_force를 호출합니다. { id_slot, action }을 포함한 POST /v1/chat/completions/control을 통해, 선택 사항인 reasoning_control이 필요에 따라 예산 샘플러 (budget sampler)를 활성화합니다. 라우터(Router) 및 단일 모델(single model)에 적용됩니다. 향후 UI 작업을 위한 뼈대로서 최소한의 WebUI 버튼을 제공합니다.
- ui: 명시적인 스트리밍 상태를 통해 추론 단계 추적
isLoading 패턴을 미러링하여 chat store에 isReasoning을 추가합니다: 대화별 맵 (per conversation map), 프라이빗 세터 (private setter), 퍼블릭 액세서 (public accessor) 및 반응형 내보내기 (reactive export)를 포함합니다. 스트림 콜백 (stream callbacks)에서 설정하며, 추론 청크 (reasoning chunks)일 때 true, 첫 번째 콘텐츠 청크 (content chunk)일 때 false로 설정하고, 스트림 종료 시 리셋하며 대화 전환 시 재동기화합니다. 건너뛰기 (skip) 버튼은 이제 isReasoning을 기준으로 작동하므로, 전체 생성 과정이 아닌 사고 단계(thinking phase) 동안에만 표시됩니다.
- ui: 제어 엔드포인트 및 액션을 상수로 추출
채팅 완성 경로 (chat completion routes), 슬롯 경로 (slots route), 추론 제어 액션 (reasoning control action)을 chat.service에서 api-endpoints 및 전용 control-actions 모듈로 이동합니다. 동작의 변화는 없으며, 매직 스트링 (magic strings)을 제거하여 제어 프로토콜이 단일 진실 공급원 (single source of truth)을 갖도록 합니다.
- server: completion id를 통한 추론 제어 타겟팅
제어 엔드포인트에 대한 @ngxson의 리뷰 내용을 반영합니다.
TOCTOU(Time-of-Check to Time-of-Use)를 방지하기 위해 id_slot에서 채팅 완료 ID (chat completion id)로 전환합니다. 조회(lookup)와 제어 요청(control request) 사이에 슬롯(slot)이 재할당될 수 있으므로, 활성화된 완료 항목(oaicompat_cmpl_id)과 일치시키는 것이 안전하며, 이미 종료된 항목은 단순히 아무것도 일치하지 않게 됩니다. 액션(action)의 이름을 reasoning_end로 변경하고, 대상 슬롯의 reasoning_control 플래그로 보호하며, 응답을 선택적 메시지를 포함한 {success}로 축소합니다.
- ui: 완료 ID를 통한 추론 제어 타겟팅
스트리밍되는 완료 ID를 메시지에 유지하고, /slots를 조사하는 대신 제어 엔드포인트(control endpoint)로 다시 전송합니다. 이를 통해 슬롯 탐색(slot discovery)과 그에 따른 TOCTOU 문제를 제거합니다. 액션은 reasoning_end로 이름이 변경되었으며, 응답은 {success}로 읽힙니다.
- server: @ngxson의 리뷰 반영
제어 필드(control fields)를 task_params로 이동하고 제어 경로(control path)의 중복된 주석을 제거합니다.
-
server: 추론 제어 엔드포인트 문서화
-
Update tools/ui/src/lib/types/database.d.ts
Co-authored-by: Aleksander Grygier aleksander.grygier@gmail.com
- ui:
cmplId를completionId로 변경
@allozaur의 리뷰에 따라, 스트리밍되는 완료 ID에 대해 더 명확한 이름을 사용합니다.
- ui: 에이전트 흐름(agentic flow)을 통한 완료 ID 캡처 연결
WebUI는 에이전트 흐름(agentic flow)을 통해 스트리밍되는데, 기존에는 relayedModel은 전달했지만 onCompletionId는 전달하지 않아 완료 ID가 메시지에 도달하지 못했고 제어 요청도 전송되지 않았습니다. 이를 흐름(flow)과 그 콜백 타입(callbacks type)을 통해 전달하고, 청크 타입(chunk type)에 ID를 선언하며, 사용 가능한 ID 없이 버튼이 실행될 경우 명시적인 에러를 로그에 남깁니다.
- ui: 메시지로부터 추론 제어 모델 타겟팅
모델은 완료 항목(completion)의 속성이므로, 관련 없는 UI 상태인 모델 드롭다운(model dropdown)이 아니라 ID와 마찬가지로 스트리밍 메시지에서 모델을 읽어옵니다. 이를 통해 요청이 단순히 어긋날 가능성이 낮은 수준을 넘어, 구조적으로 자기 일관성(self-consistent)을 갖도록 만듭니다.
공동 작성자: Aleksander Grygier aleksander.grygier@gmail.com
macOS/iOS:
- macOS Apple Silicon (arm64)
- macOS Apple Silicon (arm64, KleidiAI 활성화) 비활성화
- macOS Intel (x64)
- iOS XCFramework
Linux:
- Ubuntu x64 (CPU)
- Ubuntu arm64 (CPU)
- Ubuntu s390x (CPU)
- Ubuntu x64 (Vulkan)
- Ubuntu arm64 (Vulkan)
- Ubuntu x64 (ROCm 7.2)
- Ubuntu x64 (OpenVINO)
- Ubuntu x64 (SYCL FP32) 비활성화
Android:
Windows:
Windows:
- Windows x64 (CPU)
- Windows arm64 (CPU)
- Windows x64 (CUDA 12) - CUDA 12.4 DLLs
- Windows x64 (CUDA 13) - CUDA 13.3 DLLs
- Windows x64 (Vulkan)
- Windows x64 (SYCL) DISABLED
- Windows x64 (HIP)
openEuler:
- DISABLED
- openEuler x86 (310p)
- openEuler x86 (910b, ACL Graph)
- openEuler aarch64 (310p)
- openEuler aarch64 (910b, ACL Graph)
UI:
AI 자동 생성 콘텐츠
본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기