Cordis 설정
내장 Cordis/DSH 엔진은 두 문서와 환경 변수로 설정합니다. 기본적으로 두 문서는 백엔드 옆에 있으며, LIBRE_CORDIS_CONFIG와 LIBRE_CORDIS_SETTINGS로 위치를 변경합니다.
| 문서 | 관리자 | 형식 | 용도 |
|---|---|---|---|
cordis.patch.yml | Cordis Loader | 최상위 YAML 배열 | 엔진을 마운트하는 플러그인 행 |
cordis.config.yml | Libre WebUI 호스트 | YAML 매핑 | 제공자, 인증 정보 원본, 기능 플래그 |
Cordis의 Include 트리 캐리어는 구성 파일을 직접 읽고 최상위가 배열이 아니면 거부합니다. 따라서 호스트 설정을 같은 파일에 둘 수 없어 문서가 둘로 나뉩니다.
활성화
관리자는 설정 → 사용자 관리 → 접근 및 정책 → Cordis 엔진에서 엔진을 켭니다. 변경은 즉시 적용됩니다. 활성화하면 다음 요청에서 엔진이 시작되고, 비활성화하면 해제됩니다. 재시작은 필요하지 않습니다.
다음 두 배포 수준 설정은 값을 고정하고 UI 스위치를 비활성화합니다. 값을 조용히 덮어쓰지 않습니다.
| 원본 | 효과 |
|---|---|
LIBRE_CORDIS_ENABLED 환경 변수 | true/false로 배포의 기능 상태 고정 |
cordis.config.yml의 features.enabled | 명시된 값이 상태를 고정하며, 키를 생략하면 관리자가 선택 |
엔진에는 구성도 필요합니다. 기본 제공 예제에서 시작하세요.
cd backend
cp cordis.patch.example.yml cordis.patch.yml
cp cordis.config.example.yml cordis.config.yml
호스트는 cordis.patch.yml을 읽고 브리지 행에 자체 기본값을 병합한 뒤 <DATA_DIR>/cordis-runtime/cordis.composed.yml에 씁니다. 이 생성 파일은 폐기 가능하며 직접 수정하면 안 됩니다. 운영자의 cordis.patch.yml이 권위 있는 원본입니다.
cordis.config.yml
trace: false
model:
provider: libre-webui
# Empty selects the authenticated caller's configured default/fallback route.
model: ''
features:
# Omit enabled to let the administrator use the Settings toggle.
streaming: true
tools: true
persistence: true
# Optional absolute paths; defaults live under Libre WebUI's data directory.
# workspacePath: /absolute/path/to/workspace
# sessionStorePath: /absolute/path/to/sessions
최상위 키
| 키 | 타입 | 기본값 | 의미 |
|---|---|---|---|
trace | 불리언 | false | 모든 Cordis 활성화 상태 전환 기록 |
model | 매핑 | – | 모델 어댑터 선택. 아래 참조 |
features | 매핑 | – | 기능 스위치. 아래 참조 |
features
| 키 | 타입 | 기본값 | 의미 |
|---|---|---|---|
enabled | 불리언 | false | 엔진 마운트. false이면 모든 경로가 503 반환 |
streaming | 불리언 | true | 모델 출력을 스트리밍하는 턴 허용 |
tools | 불리언 | true | 엔진 도구 허용 및 등록 목록 공개 |
persistence | 불리언 | true | JSONL 영구 저장을 켜고 해당 서비스를 필수로 지정하여 재시작 후에도 세션 유지 |
브리지를 켜는 데 필요한 유일한 스위치는 features.enabled입니다. 최상위 enabled 키는 읽지 않습니다. 모든 기능 스위치를 features에 모아 어떤 기능이 켜졌는지 한곳에서 확인합니다.
model
| 키 | 타입 | 기본값 | 의미 |
|---|---|---|---|
provider | 문자열 | libre-webui | libre-webui, deepseek, pi-ai, none |
apiKeyEnv | 문자열 | OPENAI_API_KEY | 키가 저장된 환경 변수의 이름 |
route | 문자열 | libre-webui | 엔진이 요청에 사용하는 제공자 경로 |
model | 문자열 | '' | 요청할 모델 ID. 직접 선언한 경로에서는 반드시 설정 |
baseUrl | 문자열 | '' | 엔드포인트 재정의. 비어 있으면 어댑터 기본값 사용 |
providers | 매핑 | {} | 경로 이름을 키로 하는 직접 선언한 제공자 경로 |
엔진 모델의 원본
엔진은 자체 제공자 설정을 갖지 않습니다. 구성의 libre-webui-llm-adapter 행이 등록하는 libre-webui 경로로 Libre WebUI의 기존 제공자를 호출합니다. UI에서 채팅할 수 있는 모델을 엔진도 사용할 수 있습니다. UI에서 모델을 가져오면 이미 설정된 인증 정보와 엔드포인트를 이용해 엔진에서도 보입니다.
사용하려면 model.provider: libre-webui를 설정하세요. 기본 제공값이며 인증 정보와 제공자 엔드포인트는 Libre WebUI의 기존 설정에 남습니다.
model은 엔진이 요청할 모델 이름입니다. 빈 값은 앱의 기본 모델을 뜻합니다. 배포에 기본값이 없으면 사용 가능한 로컬 모델을 우선하여 제공자 계층이 보고한 첫 채팅 모델을 선택합니다. 임베딩 모델은 제외합니다. 내부 경로는 제공자와 모델을 함께 유지하는 lwui:ollama:<encoded-model> 또는 lwui:plugin:<encoded-provider>:<encoded-model>입니다. 같은 모델 이름이나 Ollama 장애 때문에 로컬 요청이 원격으로 전환되는 일을 막습니다. 명시적으로 선택한 제공자가 없으면 실패하며 다른 제공자로 조용히 대체하지 않습니다.
빈 model이 안전한 경우는 libre-webui 경로뿐입니다. 제공자 패키지가 처리하는 경로는 모델을 명시해야 합니다. dsh-llm-pi-ai는 카탈로그 조회를 위해 경로의 모델 목록을 해석하지만 첫 항목으로 대체하지 않습니다. 따라서 model이 없는 직접 선언 경로는 턴을 처리하지 못하고 다음 오류로 실패합니다.
provider "<route>" resolves no models; the installed catalog does not describe
this route, so its models must be listed in configuration
해당 경로의 models 목록에 있는 ID를 model에 지정하세요. 기본 예제는 route: ollama와 model: llama3.2를 짝지어 선언된 llama3.2 항목과 일치시킵니다.
provider는 마운트할 어댑터 패키지를 선택합니다.
libre-webui는 이 배포의 제공자 계층으로 엔진 요청을 처리합니다. 지원되는 기본 모드입니다.none은 모델 접근 없이 엔진을 시작합니다. 도구 목록과 세션은 작동하지만 턴에는 답할 수 없어 구성 검증에 유용합니다.deepseek와pi-ai는 제공자 패키지를 직접 마운트합니다. 이 패키지들은 백엔드의 의존성이 아닙니다. 모든 제공자 SDK를 포함하면 엔진이 쓰지 않는 기능의 폐기된 패키지까지 59개의 간접 의존성이 추가되기 때문입니다. 필요한 패키지를 설치하고 구성에 행을 마운트하세요. 없으면 호스트가 누락된 패키지 이름을 알려 줍니다.
제공자 경로는 다음 필드로 설명합니다.
| 필드 | 의미 |
|---|---|
displayName | 사람이 읽는 이름 |
api | 통신 프로토콜. 예: openai-completions |
baseURL | 엔드포인트 기본 주소 |
apiKeyEnv | 키를 가진 환경 변수 |
models | 모델 목록. 각 항목은 id, name, contextWindow, maxTokens 사용 |
어느 문서에도 인증 정보를 쓰지 않습니다. apiKeyEnv는 환경 변수 이름이며 어댑터가 요청마다 읽으므로 키를 교체해도 재시작이 필요 없습니다.
cordis.patch.yml
Cordis Loader 항목의 최상위 배열입니다. 기본 예제는 9개 행을 마운트하며 권장 시작점입니다.
- id: llm
name: '@deepseek-ai/dsh-llm'
- id: session
name: '@deepseek-ai/dsh-session'
- id: session-projection
name: '@deepseek-ai/dsh-session-projection'
- id: session-persistence
name: '@deepseek-ai/dsh-session-persistence-jsonl'
config:
# The host supplies the resolved sessionStorePath.
- id: system-prompt
name: '@deepseek-ai/dsh-system-prompt'
config:
personaPrefix: ''
- id: tools
name: '@deepseek-ai/dsh-tools'
- id: agent
name: '@deepseek-ai/dsh-agent'
- id: agent-loop
name: '@deepseek-ai/dsh-agent-loop'
config:
agents: []
- id: libre-webui-bridge
name: './dist/cordis/dsh/engine-plugin.js'
항목 필드
| 필드 | 필수 | 의미 |
|---|---|---|
id | 아니요 | 행을 지정하는 안정적 ID. 생략 시 name에서 파생 |
name | 예 | Loader가 가져오는 모듈 지정자. 문자열 리터럴이어야 함 |
config | 아니요 | 플러그인 설정. !!js 표현식 허용 |
disabled | 아니요 | 삭제하지 않고 행 건너뛰기. !!js 허용 |
inject | 아니요 | 행의 추가 필수 서비스 또는 가로채기 설정 |
Loader는 name을 직접 가져오며 평가하지 않으므로 !!js 표현식을 쓸 수 없습니다. config 값에는 !!js를 사용할 수 있고, 나중에 행의 파이버에서 Loader 컨텍스트를 참조하여 평가됩니다. process.env와 ctx.get(...)는 사용할 수 있지만 import.meta는 사용할 수 없습니다.
상대 지정자는 구성 파일 자체의 디렉터리를 기준으로 해석합니다. 패키지 이름만 있는 지정자는 백엔드 패키지를 통해 해석하므로 @deepseek-ai/dsh-tools는 backend/node_modules의 복사본을 찾습니다.
행 순서는 로드 순서를 결정하지 않습니다. Cordis는 선언한 서비스가 준비되면 행을 활성화하므로 위의 그룹은 읽는 사람을 위한 구분일 뿐입니다.
필수 행
채팅에 답하는 엔진에는 다음 항목이 모두 필요합니다.
| 행 | 제공 항목 | 필요한 곳 |
|---|---|---|
dsh-llm | llm | 에이전트 루프 |
dsh-session | sessions | 에이전트 루프, 브리지 |
dsh-session-projection | sessionProjections | 에이전트 루프 |
dsh-system-prompt | systemPrompt | 도구, 에이전트 루프 |
dsh-tools | tools | 에이전트 루프, 브리지 |
dsh-agent | agents | 브리지 |
dsh-agent-loop | 에이전트 드라이버 | 턴 응답 |
| 브리지 행 | libreDshEngine | 모든 경로 |
GET /api/cordis/tools가 내용을 반환하려면 @deepseek-ai/dsh-fs-sandbox와 @deepseek-ai/dsh-tool-fs 같은 도구 플러그인 행도 마운트해야 합니다. 도구 플러그인이 없는 등록 목록이 빈 것은 정상입니다.
환경 변수
모든 설정 값에는 환경 변수 재정의가 있습니다. 환경 변수, 문서, 내장 기본값 순서로 우선합니다.
| 변수 | 재정의 대상 | 기본값 |
|---|---|---|
LIBRE_CORDIS_ENABLED | features.enabled | false |
LIBRE_CORDIS_STREAMING | features.streaming | true |
LIBRE_CORDIS_TOOLS | features.tools | true |
LIBRE_CORDIS_PERSISTENCE | features.persistence | true |
LIBRE_CORDIS_TRACE | trace | false |
LIBRE_CORDIS_MODEL_PROVIDER | model.provider | libre-webui |
LIBRE_CORDIS_MODEL_ROUTE | model.route | libre-webui |
LIBRE_CORDIS_MODEL | model.model | '' |
LIBRE_CORDIS_API_KEY_ENV | model.apiKeyEnv | OPENAI_API_KEY |
LIBRE_CORDIS_BASE_URL | model.baseUrl | '' |
LIBRE_CORDIS_CONFIG | 구성 문서 경로 | <cwd>/cordis.patch.yml |
LIBRE_CORDIS_SETTINGS | 설정 문서 경로 | 구성 문서 옆 |
LIBRE_CORDIS_WORKSPACE | 엔진 기본 작업 공간 | <DATA_DIR>/cordis-workspace |
LIBRE_CORDIS_SESSION_STORE | 영구 세션 디렉터리 | <DATA_DIR>/cordis-sessions |
불리언 변수는 1/true/yes/on과 0/false/no/off를 받습니다. 해석할 수 없는 값은 추측하지 않고 문서 설정으로 돌아갑니다.
기본 구성의 !!js 표현식도 LIBRE_CORDIS_SESSION_STORE와 LIBRE_CORDIS_WORKSPACE를 읽으므로 호스트는 트리를 마운트하기 전에 두 값을 내보냅니다.
설정 예제
완전히 오프라인인 로컬 Ollama
features:
enabled: true
model:
provider: pi-ai
route: ollama
model: llama3.2
apiKeyEnv: OLLAMA_API_KEY
providers:
ollama:
api: openai-completions
baseURL: http://127.0.0.1:11434/v1
apiKeyEnv: OLLAMA_API_KEY
models:
- id: llama3.2
contextWindow: 131072
maxTokens: 4096
Ollama는 키를 무시하지만 OpenAI 클라이언트에는 값이 필요합니다. OLLAMA_API_KEY=ollama를 내보내면 비밀 정보를 만들지 않고 조건을 충족합니다. 어떤 데이터도 컴퓨터 밖으로 나가지 않습니다.
OpenAI 호환 게이트웨이
features:
enabled: true
model:
provider: pi-ai
route: gateway
model: acme-large
apiKeyEnv: ACME_GATEWAY_API_KEY
providers:
gateway:
displayName: Acme Gateway
api: openai-completions
baseURL: https://gateway.acme.example/v1
apiKeyEnv: ACME_GATEWAY_API_KEY
models:
- id: acme-large
contextWindow: 65536
maxTokens: 4096
DeepSeek 공식 제공자
features:
enabled: true
model:
provider: deepseek
route: deepseek
apiKeyEnv: DEEPSEEK_API_KEY
백엔드 환경에 DEEPSEEK_API_KEY를 설정하세요.
제공자 없이 도구만 사용
features:
enabled: true
model:
provider: none
엔진이 시작되고 세션을 만들 수 있으며 GET /api/cordis/tools는 설정된 도구 플러그인을 나열합니다. 요청을 처리할 어댑터가 없으므로 메시지 전송은 실패합니다.
마이그레이션 참고 사항
Cordis 브리지는 추가 기능입니다. 기본적으로 꺼져 있고, 꺼진 동안 기존 동작을 바꾸지 않습니다.
기존 배포 업그레이드. 필요한 작업은 없습니다. 두 예제는 cordis.patch.example.yml과 cordis.config.example.yml로 제공되며, 복사하고 기능을 켜기 전에는 읽지 않습니다. 마이그레이션을 실행하거나 테이블을 만들거나 기존 데이터 디렉터리를 변경하지 않습니다.
처음 활성화. 두 예제를 복사하고 features.enabled: true를 설정하세요. 엔진 패키지는 이미 백엔드 의존성이므로 추가 설치가 필요 없습니다. 첫 요청에서 <DATA_DIR>/cordis-workspace, <DATA_DIR>/cordis-sessions, <DATA_DIR>/cordis-runtime을 만듭니다. 모두 기존 데이터 디렉터리 아래의 새 디렉터리이므로 기존 백업과 복원이 상위 데이터 디렉터리를 포함한다면 함께 처리됩니다.
엔진 업그레이드. 확정된 엔진 버전은 package-lock.json에 기록되며 backend/package.json은 alpha 호환 범위를 선언합니다. 의도적으로 업그레이드하고 npm install 후 제공자와 세션 계약을 검증하세요. DSH 패키지에 peer dependency가 추가되면 npm이 마운트가 아니라 설치 시점에 알립니다. 모델과 세션 형식은 DSH가 관리하므로 형식 변경은 Libre WebUI 마이그레이션이 아닌 DSH 릴리스 노트에 해당합니다.
롤백. features.enabled: false를 설정하고 재시작하거나 cordis.patch.yml에서 브리지 행을 제거하세요. libreDshEngine 서비스와 리스너를 해제하고 생성한 에이전트를 모두 정리합니다. 세션 파일은 데이터로 디스크에 남으며, 공간을 확보하려면 sessionStorePath 디렉터리를 삭제해야 합니다. 패키지 제거는 선택 사항이며 Libre WebUI의 다른 기능에 영향을 주지 않습니다.
기존 Chat과 Work 배포. Chat에는 임시 엔진 세션과 기존 대화 기록을 사용하는 관리자 전용 DeepSeek Harness 선택지가 생깁니다. Work에는 격리된 DSH 드라이버와 기존 샌드박스·승인 절차를 사용하는 별도 엔진 선택지가 생깁니다. 기존 모델 선택은 원래대로 동작합니다.
표준 libre-webui 어댑터에서 Chat의 에이전트 선택기는 기본 프로필과 명시적인 DSH 제공자 모델을 제공합니다. 명시적 선택은 한정된 제공자 신원을 유지하고, 기본 프로필은 실행 중인 구성의 기본 모델을 사용합니다. 해당 모델의 제목과 사고 요약은 에이전트 도구 없이 기반 제공자를 직접 호출합니다. 사용자 지정 어댑터 경로는 기본 Chat 항목만 유지하며 제목과 사고 요약에 별도의 Ollama 또는 플러그인 작업 모델이 필요합니다.
DSH는 관리자의 Ollama 스위치를 따릅니다. 비활성화되면 모델을 나열하거나 탐색하지 않으며 명시적인 Ollama 선택은 제공자를 바꾸지 않고 실패합니다. 운영자가 고정한 비한정 모델 이름도 안전하게 해석하려면 Ollama 카탈로그가 필요합니다. 플러그인 전용 배포에서는 lwui:plugin:<plugin>:<model>로 한정하세요.
운영 경계
- 호스트 엔진과 Chat은 관리자 전용이며 solo 모드에서만 사용합니다. 엔진 페이지는 로컬 JSONL 저장소를 사용하는 공유 관리자 콘솔이며 team 모드에서 마운트할 수 없습니다. 샌드박스 Work는 기존 SQL 저장소를 사용합니다.
- 모델 호출은 인증된 호출자 정보를 사용합니다. 대화형 호스트 턴은 해당 관리자의 제공자 인증 정보와 기본 모델 설정을 사용합니다. 신뢰된 비대화형 구성은
LIBRE_CORDIS_USER를 활성 관리자 ID로 명시할 수 있습니다. 가장 오래된 관리자를 암묵적으로 대신 선택하지 않습니다. - 호스트 파일 도구는 작업 공간 안에서만 작동합니다. 읽기와 쓰기는 정규화된 대상을 확인하며 세션은 설정된 루트 밖을 작업 디렉터리로 선택할 수 없습니다. 네이티브 DSH 변경 제한도 적용됩니다. 운영자가 추가한 플러그인은 신뢰된 서버 코드입니다.
- 호스트 도구는 DSH 정책을 따릅니다. 엔진 페이지는 세션별 읽기 전용·쓰기 제어와 네이티브 일회성 승인 카드를 제공합니다. 작업 공간 경계를 우회하지 않습니다. UI가 없는 Chat은 표시할 수 없는 승인을 거부합니다. Work 드라이버는 호스트 파일 도구 없이 Work 승인과 컨테이너 격리를 사용합니다.
- 스트림에는 실시간 텍스트와 공개된 추론이 들어갑니다. 영구 메시지는 완성된 대화 기록을 보관하며 실시간 텍스트를 클라이언트에 중복 전송하지 않습니다.
- 재시작과 삭제는 저장된 세션을 사용합니다. 빈 세션과 완료된 세션도 재시작 후 남습니다. 브리지가 만든 JSONL 세션을 삭제하면 작성자를 멈추고 파일을 제거합니다. 다른 영구 저장 구현에는 적절한 삭제 어댑터가 필요합니다.
- 잘못된 레거시 로그는 명시적으로 복구해야 합니다. 이전 브리지는 필수 ID 없는 사용자 메시지를 기록했습니다. 엄격한 읽기 처리는 로그를 버리지 않고 거부합니다. 문제 해결의 복구 절차를 참조하세요.
- 제목은 로컬에서 만듭니다. 세션 요약은 첫 사용자 메시지를 짧은 제목으로 사용하며 빈 세션에는 파생 제목이 없습니다.
실행 중인 DSH 인스턴스의 모델 연결
선택적 dsh-native-provider 플러그인은 포트 3080의 로컬 웹 앱처럼 다른 DSH 인스턴스에 이미 설정된 모델과 제공자 연결을 노출합니다. 해당 인스턴스의 기존 프로필에 설치하세요. ctx.llm만 호출하므로 키는 DSH에 남고, 연결은 세션 생성, 에이전트 실행, 네이티브 첨부 파일 읽기나 도구 실행을 할 수 없습니다.
두 프로세스는 같은 Unix 호스트에서 같은 OS 계정으로 실행되어야 합니다. 명시적으로 설정된 Unix 소켓을 사용하며 물리 디렉터리는 해당 계정 소유의 0700, 소켓은 0600 권한이어야 합니다. TCP 리스너를 추가하거나 DSH 브라우저 인증을 재사용·완화하지 않습니다. Windows 및 원격 DSH 호스트는 지원하지 않습니다.
OS 계정이 로컬 접근 경계입니다. 같은 계정으로 실행되는 다른 프로세스도 소켓을 사용할 수 있습니다. 연결은 같은 계정을 공유하는 앱 사이의 격리나 별도 네이티브 제공자 인증 정보를 제공하지 않습니다.
독립 플러그인 설치
DSH → Plugins → Add plugin에서 Package name or address에 다음 공개 저장소 URL을 붙여 넣고 Install을 클릭하세요.
https://github.com/libre-webui/dsh-native-provider
DSH가 요청하면 구성 요소를 활성화하세요. 공개 패키지는 Apache-2.0 라이선스의 0.1.1 버전이며 빌드된 런타임과 번들 패치를 포함합니다. 로컬 빌드, 설치 스크립트, npm 런타임 의존성이 필요 없습니다. @libre-webui/dsh-native-provider라는 패키지 이름은 npm에 게시되지 않았으므로 대화 상자에서 GitHub URL을 사용하세요.
번들은 <DSH home>/lwui-provider/llm.sock을 선택하며 보통 $HOME/.dsh/lwui-provider/llm.sock입니다. DSH_HOME이 설정되어 있으면 우선합니다. 비공개 소켓 디렉터리가 없으면 생성합니다. DSH 홈마다 활성 브리지 하나만 사용하거나, 추가 프로필의 사용자 cordis.patch.yml에서 소켓 경로를 재정의하세요. 전체 경로는 100 UTF-8 바이트 이내이며 심볼릭 링크 구성 요소가 없어야 합니다. 재정의는 독립 패키지 설정 가이드를 참조하세요.
동일한 CLI 명령은 다음과 같습니다.
dsh plugin --profile web add https://github.com/libre-webui/dsh-native-provider
실제로 실행하는 프로필이 web이 아니면 해당 이름을 사용하세요. CLI 설치 후 프로필을 재시작해야 합니다. 실행 중인 UI로 설치하면 즉시 활성화할 수 있지만 DSH가 재시작 알림을 표시하면 따르세요. 원본 DSH 소스 수정이나 제공자 키 복사는 필요 없습니다.
Libre WebUI에서 번들 준비
Libre WebUI에도 준비 스크립트가 포함됩니다. 소스 체크아웃에서 백엔드를 빌드하고 새 출력 디렉터리를 준비하세요.
npm run build:backend
node scripts/prepare-dsh-provider.mjs /absolute/dsh-provider-bundle /absolute/private-directory/provider.sock
dsh plugin --profile web add /absolute/dsh-provider-bundle
npm 배포본은 컴파일된 백엔드와 준비 스크립트를 포함하므로 빌드 단계 없이 설치 디렉터리에서 마지막 두 명령을 실행합니다. 이후 선택한 DSH 프로필을 다시 시작하세요. 두 준비 방식 모두 기존 출력 디렉터리를 거부하고 패키지 정보, 라이선스, 설치 안내를 포함합니다.
Libre WebUI 연결
Libre WebUI의 cordis.config.yml에 동일한 절대 소켓 경로를 지정하세요. 공개 번들의 기본값에서는 /absolute/home을 실제 홈 디렉터리로 바꿉니다.
nativeProvider:
socketPath: /absolute/home/.dsh/lwui-provider/llm.sock
또는 LIBRE_DSH_PROVIDER_SOCKET에 해당 절대 경로를 설정하세요. 환경 변수 값이 비어 있으면 파일에 경로가 있어도 연결을 비활성화합니다. LWUI의 Cordis 엔진을 켜면 활성 관리자는 Work의 DeepSeek Harness 엔진, 엔진 페이지, Chat 에이전트 그룹에서 네이티브 모델을 고를 수 있습니다. Chat에는 에이전트 CLI 모델도 필요합니다. Work는 providerType: dsh와 원본 모델·제공자 ID를 저장하며 기존 LWUI 기반 DSH 작업은 원래 제공자와 엔진 표시를 유지합니다.
네이티브 모델 목록은 실시간으로 읽습니다. 제공자나 인증 설정이 바뀌면 연결 세대를 무효화하고 진행 중인 네이티브 호출을 취소합니다. 소켓, 모델, 네이티브 제공자가 없으면 요청을 중단하며 Ollama나 다른 제공자로 대체하지 않습니다. 제목과 사고 요약은 선택한 LLM을 도구 없이 직접 호출합니다. 초기 연결은 텍스트, 추론, 도구 메시지를 받지만 네이티브 이미지·파일 참조는 거부합니다.
네이티브 인증 정보는 DSH 운영자의 것이므로 일반 Work가 더 많은 사용자에게 열려 있어도 이 연결은 관리자 전용입니다. DSH 제공자 설정에 따라 요청이 호스트 밖으로 나갈 수 있고 Work는 원격 제공자 안내를 표시합니다. 팀 배포에서 이런 작업을 처리하는 모든 워커는 설정된 로컬 연결에 접근할 수 있어야 하며, 연결이 없으면 실행을 거부합니다. Cordis를 끄거나 소켓 설정을 지우면 저장된 작업은 보존하면서 네이티브 접근을 철회합니다. DSH가 충돌해 소켓이 남으면 소유 인스턴스를 중지하고 오래된 소켓만 제거한 뒤 재시작하세요. 플러그인은 기존 파일 시스템 항목을 교체하지 않습니다.
플러그인 업그레이드 또는 제거
변경 전에 활성 네이티브 요청을 완료하거나 취소하세요. 이전 로컬 0.0.0/0.1.0 번들은 DSH UI에서 Uninstall을 선택하고 Add plugin으로 돌아가 위 GitHub URL로 설치합니다. 사용자 지정 소켓은 지원되는 사용자 프로필 재정의로 유지하세요. 네이티브 세션과 인증 정보는 보존됩니다.
이미 GitHub에서 설치한 경우 CLI로 업데이트할 수 있습니다.
dsh plugin --profile web update @libre-webui/dsh-native-provider
CLI 업데이트 후 재시작하고 버전을 확인하세요. 이전에 꺼져 있던 플러그인은 그대로이므로 연결 검사 전에 활성 상태를 확인합니다. 고정 또는 롤백은 github:libre-webui/dsh-native-provider#<commit>을 원본으로 사용합니다. 로컬에서 준비한 번들은 새 출력 디렉터리로 빌드하여 다시 추가하세요. 로컬 의존성을 업데이트해도 GitHub에서 가져오지 않습니다.
연결을 제거하려면 먼저 LWUI의 nativeProvider.socketPath 설정을 지우거나 LIBRE_DSH_PROVIDER_SOCKET을 빈 값으로 설정한 다음 실행하세요.
dsh plugin --profile web remove @libre-webui/dsh-native-provider
제거 후 DSH 프로필을 재시작하세요. 저장된 LWUI 작업은 남지만 같은 명시적 연결을 복원할 때까지 네이티브 요청은 실패합니다. 이 플러그인을 제거해도 DSH의 제공자 설정과 인증 정보는 삭제되지 않습니다. 이전 생성 번들 디렉터리는 더 이상 설치 대상으로 쓰이지 않을 때만 삭제하세요.
네이티브 제공자 사용량
네이티브 요청은 프로바이더 사용량의 DeepSeek Harness · 제공자 아래 원본 모델 이름으로 표시합니다. 도구 라운드, 제목, 사고 요약을 포함한 실제 모델 요청마다 한 번 계산합니다. 성공, 실패, 취소 호출, 지연 시간, DSH가 보고한 토큰 수를 표시합니다. 캐시 입력은 총 입력에 한 번만 포함하며 누락된 값은 추정하지 않고 미계측 상태로 둡니다. 제공자 ID는 dsh-native:<percent-encoded-native-provider-id>이며 기존 요금·비용 규칙에서 사용합니다. 모르는 요금은 가격을 산정하지 않습니다.
LWUI에 설정된 제공자를 사용하는 DSH 요청은 해당 제공자의 기존 기록에 남습니다. 카탈로그 조회와 네이티브 추론 전에 거부된 요청은 추가 모델 호출 기록을 만들지 않습니다. 계측은 이 연결 버전의 설치 시점에 시작되며 과거 사용량을 만들지 않습니다. 저장되는 항목은 식별 정보, 상태, 시간, 카운터뿐입니다. 프롬프트, 응답, 인증 정보, 엔드포인트, 제공자 오류 본문은 저장하지 않습니다.
설정 검증
curl -s http://127.0.0.1:3001/api/cordis/health | jq
{
"success": true,
"enabled": true,
"ready": true,
"services": [
{ "name": "llm", "state": "ready" },
{ "name": "systemPrompt", "state": "ready" },
{ "name": "sessions", "state": "ready" },
{ "name": "tools", "state": "ready" },
{ "name": "agents", "state": "ready" }
]
}
code: CORDIS_UNAVAILABLE과 함께 반환된 503은 구성이 마운트되지 않았다는 뜻입니다. 이유는 error 필드에 있으며 LIBRE_CORDIS_TRACE=true는 Cordis 활성화 로그를 추가합니다. 일반적인 원인은 문제 해결을 참조하세요.