การตั้งค่า Cordis
เอนจิน Cordis/DSH ใช้เอกสารสองไฟล์และตัวแปรสภาพแวดล้อม โดยไฟล์อยู่ข้าง backend ตามค่าเริ่มต้น LIBRE_CORDIS_CONFIG และ LIBRE_CORDIS_SETTINGS เปลี่ยนตำแหน่งได้
| เอกสาร | เจ้าของ | รูปแบบ | หน้าที่ |
|---|---|---|---|
cordis.patch.yml | Cordis Loader | YAML อาร์เรย์ ระดับบน | แถวปลั๊กอินที่โหลดเอนจิน |
cordis.config.yml | โฮสต์ Libre WebUI | YAML mapping | ผู้ให้บริการ แหล่งข้อมูลรับรอง และสวิตช์ |
ต้องแยกไฟล์เพราะ Cordis Include อ่านองค์ประกอบเองและรับเฉพาะอาร์เรย์ระดับบน การตั้งค่าโฮสต์จึงอยู่ในไฟล์เดียวกันไม่ได้
การเปิดใช้งาน
ผู้ดูแลเปิดได้ที่ การตั้งค่า → จัดการผู้ใช้ → การเข้าถึงและนโยบาย → เอนจิน Cordis มีผลทันที การเปิดทำให้เอนจินเริ่มเมื่อมีคำขอถัดไป ส่วนการปิดคืนทรัพยากรเอนจิน ไม่ต้อง restart
แหล่งกำหนดค่าระดับการติดตั้งสองแบบตรึงค่าได้ ทั้งคู่ทำให้สวิตช์เป็นสีเทา ไม่ถูกแทนเงียบ ๆ:
| แหล่ง | ผล |
|---|---|
LIBRE_CORDIS_ENABLED ตัวแปรสภาพแวดล้อม | true/false ตรึงฟังก์ชันทั้งการติดตั้ง |
features.enabled ใน cordis.config.yml | ค่าที่ระบุชัดเจนตรึงไว้ หากไม่มีคีย์ผู้ดูแลเลือกได้ |
เอนจินยังต้องมีองค์ประกอบ เริ่มจากตัวอย่างที่ให้มา:
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 ของ operator
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 | boolean | false | บันทึกทุกการเปลี่ยนสถานะ Cordis |
model | mapping | – | เลือกอะแดปเตอร์โมเดล ดูด้านล่าง |
features | mapping | – | สวิตช์ความสามารถ ดูด้านล่าง |
features
| คีย์ | ชนิด | ค่าเริ่มต้น | ความหมาย |
|---|---|---|---|
enabled | boolean | false | โหลดเอนจิน เมื่อปิดทุกเส้นทางคืน 503 |
streaming | boolean | true | รับรอบที่สตรีมผลโมเดล |
tools | boolean | true | อนุญาตเครื่องมือและแสดงทะเบียน |
persistence | boolean | true | เปิดและกำหนดให้มี JSONL เซสชันอยู่ข้าม restart |
features.enabled เป็นสวิตช์เดียวที่ต้องตั้งเพื่อเปิดสะพานเชื่อม คีย์ enabled ระดับบนไม่ถูกอ่าน การรวมสวิตช์ใน features ทำให้ตรวจได้ที่เดียวว่าเปิดอะไร
model
| คีย์ | ชนิด | ค่าเริ่มต้น | ความหมาย |
|---|---|---|---|
provider | ข้อความ | libre-webui | libre-webui, deepseek, pi-ai หรือ none |
apiKeyEnv | ข้อความ | OPENAI_API_KEY | ชื่อ ตัวแปรสภาพแวดล้อมที่เก็บคีย์ |
route | ข้อความ | libre-webui | เส้นทางผู้ให้บริการที่เอนจินระบุ |
model | ข้อความ | '' | ID โมเดลที่ขอ ต้องตั้งค่า สำหรับเส้นทางเขียนเอง |
baseUrl | ข้อความ | '' | endpoint ทดแทน ค่าว่างใช้ค่าของอะแดปเตอร์ |
providers | mapping | {} | เส้นทางผู้ให้บริการที่ระบุเอง แยกตามชื่อ |
โมเดลของเอนจินมาจากที่ใด
เอนจินไม่มีการตั้งค่าผู้ให้บริการของตนเอง แต่เรียกผู้ให้บริการที่ LWUI มีผ่านเส้นทาง libre-webui ที่แถว libre-webui-llm-adapter ลงทะเบียน โมเดลที่แชทได้ใน UI คือโมเดลที่เอนจินใช้ได้ เมื่อดาวน์โหลดโมเดลใน UI เอนจินก็เห็นพร้อมข้อมูลรับรองและ endpoint ที่ตั้งไว้
ใช้ model.provider: libre-webui ซึ่งเป็นค่าเริ่มต้นที่ให้มา ข้อมูลรับรองและ endpoint อยู่ในระบบการตั้งค่าเดิมของ LWUI
model ระบุโมเดลที่ขอ ค่าว่างหมายถึงค่าเริ่มต้นแอป หากไม่มีจะใช้โมเดลแชทแรกที่ชั้นผู้ให้บริการรายงาน โดยเลือกโมเดลในเครื่องที่พร้อมใช้ก่อน ไม่รวม embedding เส้นทางภายในรักษาทั้งโมเดลและผู้ให้บริการ: lwui:ollama:<encoded-model> หรือ lwui:plugin:<encoded-provider>:<encoded-model> จึงไม่ส่งคำขอในเครื่องออกไปยังผู้ให้บริการระยะไกลเพราะชื่อซ้ำหรือ Ollama ล่ม ตัวเลือกผู้ให้บริการที่ระบุชัดแต่ไม่พร้อมจะล้มเหลว ไม่สลับให้อัตโนมัติ
model ว่างปลอดภัยเฉพาะเส้นทาง libre-webui เส้นทางที่ใช้แพ็กเกจผู้ให้บริการต้องระบุโมเดล dsh-llm-pi-ai ใช้แคตตาล็อกเพื่อตอบคำถามรายการ แต่ไม่เลือกตัวแรกเป็น fallback เส้นทางที่ประกาศเองโดยไม่มี model จะไม่รับรอบและแจ้ง:
provider "<route>" resolves no models; the installed catalog does not describe
this route, so its models must be listed in configuration
ตั้ง model เป็น ID จากรายการ models ของเส้นทาง ตัวอย่างจับคู่ route: ollama กับ model: llama3.2 ให้ตรงรายการ llama3.2 ที่ประกาศ
provider เลือกแพ็กเกจอะแดปเตอร์ที่จะโหลด:
libre-webuiใช้ชั้นผู้ให้บริการของการติดตั้งนี้ เป็นโหมดที่รองรับและเป็นค่าเริ่มต้นnoneเริ่มโดยไม่มีโมเดล เครื่องมือแสดงได้และเซสชันทำงาน แต่ตอบรอบไม่ได้ เหมาะสำหรับตรวจองค์ประกอบdeepseekและpi-aiโหลดแพ็กเกจผู้ให้บริการโดยตรง ไม่ได้เป็น dependency ของ backend นี้ การรวมทุก SDK เคยดึงแพ็กเกจทางอ้อม 59 ตัว รวมตัวเลิกใช้สำหรับความสามารถที่เอนจินไม่ใช้ ติดตั้งแพ็กเกจที่ต้องการแล้วเพิ่มแถว หากไม่มี โฮสต์จะระบุชื่อแพ็กเกจ
เส้นทางผู้ให้บริการอธิบายด้วย:
| ฟิลด์ | ความหมาย |
|---|---|
displayName | ชื่อที่อ่านเข้าใจ |
api | โปรโตคอล เช่น openai-completions |
baseURL | URL ฐานของ endpoint |
apiKeyEnv | ตัวแปรสภาพแวดล้อมที่เก็บคีย์ |
models | รายการโมเดล แต่ละตัวรับ id, name, contextWindow, maxTokens |
ข้อมูลรับรองไม่ถูกเขียนลงเอกสารทั้งสอง apiKeyEnv ระบุชื่อของตัวแปรที่อะแดปเตอร์อ่านต่อคำขอ การหมุนคีย์จึงไม่ต้อง restart
cordis.patch.yml
อาร์เรย์รายการ Cordis Loader ระดับบน ตัวอย่างที่ให้มามีเก้าแถวและเป็นจุดเริ่มต้นที่แนะนำ
- 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 import ต้องเป็นข้อความ literal |
config | ไม่ | ค่าปลั๊กอิน ใช้ !!js ได้ |
disabled | ไม่ | ข้ามแถวโดยไม่ลบ ใช้ !!js ได้ |
inject | ไม่ | บริการจำเป็นเพิ่มเติมหรือการตั้งค่าดักรับ |
Loader import name โดยตรง ไม่ประเมินนิพจน์ จึงใช้ !!js ไม่ได้ ค่า config ใช้ !!js ได้ โดยประเมินภายหลังในไฟเบอร์เจ้าของแถวพร้อม context ของ Loader process.env และ ctx.get(...) ใช้ได้ แต่ import.meta ใช้ไม่ได้
ตัวระบุสัมพัทธ์อ้างอิง โฟลเดอร์ของไฟล์องค์ประกอบเอง ชื่อแพ็กเกจอ้างผ่าน backend ดังนั้น @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 | ทุกเส้นทาง |
ต้องโหลดปลั๊กอินเครื่องมือด้วย เช่น @deepseek-ai/dsh-fs-sandbox กับ @deepseek-ai/dsh-tool-fs จึงมีรายการจาก GET /api/cordis/tools ทะเบียนที่ไม่มีปลั๊กอินเครื่องมือเป็นค่าว่างอย่างถูกต้อง
ตัวแปรสภาพแวดล้อม
ทุกค่ามีตัวแปรแทนค่าได้ ตัวแปรสำคัญกว่าเอกสาร และเอกสารสำคัญกว่าค่าเริ่มต้นภายใน
| ตัวแปร | แทนค่า | ค่าเริ่มต้น |
|---|---|---|
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 |
ตัวแปร boolean รับ 1/true/yes/on และ 0/false/no/off ค่าที่อ่านไม่ได้จะกลับไปใช้เอกสารแทนการเดา
นิพจน์ !!js ที่ให้มาอ่าน LIBRE_CORDIS_SESSION_STORE และ LIBRE_CORDIS_WORKSPACE ด้วย โฮสต์จึง export ก่อนโหลดต้นไม้
ตัวอย่างการตั้งค่า
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 ได้โดยไม่สร้างความลับปลอม ไม่มีข้อมูลออกจากเครื่อง
Gateway ที่เข้ากันได้กับ 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 ในสภาพแวดล้อม backend
ไม่มีผู้ให้บริการ ใช้เฉพาะเครื่องมือ
features:
enabled: true
model:
provider: none
เอนจินเริ่ม สร้างเซสชันได้ และ GET /api/cordis/tools แสดงปลั๊กอินที่ตั้งไว้ การส่งข้อความล้มเหลวเพราะไม่มีอะแดปเตอร์ให้บริการ
หมายเหตุการย้ายรุ่น
สะพานเชื่อมเป็นส่วนเพิ่ม เมื่อปิดตามค่าเริ่มต้นจะไม่เปลี่ยนพฤติกรรมเดิม
อัปเกรดการติดตั้งเดิม ไม่ต้องทำอะไร ตัวอย่าง cordis.patch.example.yml และ cordis.config.example.yml ไม่ถูกใช้จนกว่าจะคัดลอกและเปิดฟังก์ชัน ไม่มี migration ไม่สร้างตาราง และไม่แตะโฟลเดอร์ข้อมูลเดิม
เปิดครั้งแรก คัดลอกสองตัวอย่างและตั้ง features.enabled: true ไม่ต้องติดตั้งเพิ่มเพราะ backend มีแพ็กเกจแล้ว คำขอแรกสร้าง <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 การเปลี่ยนรูปแบบอยู่ในบันทึกการออกรุ่น DSH ไม่ใช่ migration ของ LWUI
ย้อนกลับ ตั้ง features.enabled: false และ restart หรือลบแถวจาก cordis.patch.yml บริการ libreDshEngine และตัวฟังถูกถอน เอเจนต์ถูกคืน ไฟล์เซสชันยังเป็นข้อมูล ลบ sessionStorePath เพื่อคืนพื้นที่ การถอนแพ็กเกจเป็นตัวเลือกและไม่กระทบฟังก์ชันอื่น
Chat และ Work เดิม Chat เพิ่ม DeepSeek Harness เฉพาะผู้ดูแล ใช้เซสชันชั่วคราวและบทสนทนาเดิม Work เพิ่มตัวเลือกเอนจินแยกด้วยไดรเวอร์ DSH ที่แยกและระบบ sandbox/อนุมัติเดิม โมเดลที่เลือกไว้ก่อนยังทำงานเหมือนเดิม
เมื่อใช้ libre-webui ตัวเลือกเอเจนต์ Chat มีทั้งคู่ผู้ให้บริการ-โมเดล DSH เฉพาะและโปรไฟล์พื้นฐาน ตัวเลือกเฉพาะรักษาตัวตนที่ครบ ส่วนพื้นฐานใช้ค่าเริ่มต้นขององค์ประกอบที่ทำงาน ชื่อและสรุปเรียกผู้ให้บริการโดยตรงไม่ใช้เครื่องมือ อะแดปเตอร์กำหนดเองแสดงเพียงรายการพื้นฐานและต้องมีโมเดลงาน Ollama หรือปลั๊กอินแยกเพื่อสร้างชื่อและสรุป
DSH เคารพสวิตช์ Ollama ของผู้ดูแล เมื่อปิดจะไม่แสดงหรือตรวจโมเดล และการเลือก Ollama อย่างชัดเจนจะล้มเหลวโดยไม่เปลี่ยนผู้ให้บริการ ชื่อโมเดลที่ operator ตรึงโดยไม่ระบุผู้ให้บริการก็ต้องใช้แคตตาล็อก Ollama เพื่อแก้เส้นทางอย่างปลอดภัย การติดตั้งเฉพาะปลั๊กอินควรใช้ lwui:plugin:<plugin>:<model>
ขอบเขตการทำงาน
- เอนจินโฮสต์และ Chat เฉพาะผู้ดูแลและ solo หน้าเอนจินเป็นคอนโซลร่วมกับ JSONL ในเครื่อง จึงโหลดใน team ไม่ได้ Work ใช้ SQL เดิมแทน
- การเรียกโมเดลใช้ผู้ร้องขอที่ยืนยันตัวตน รอบโฮสต์แบบโต้ตอบใช้ข้อมูลรับรองและค่าโมเดลของผู้ดูแลคนนั้น องค์ประกอบที่ไม่โต้ตอบและเชื่อถือได้ตั้ง
LIBRE_CORDIS_USERเป็น ID ผู้ดูแลที่ active ได้ชัดเจน ไม่มี fallback ไปผู้ดูแลที่เก่าสุด - เครื่องมือไฟล์โฮสต์ถูกจำกัดในพื้นที่งาน อ่านและเขียนตรวจเป้าหมาย canonical เซสชันเลือกโฟลเดอร์นอก root ไม่ได้ ข้อจำกัดการแก้ไข DSH ยังใช้ ปลั๊กอินเพิ่มเติมของ operator เป็นโค้ดเซิร์ฟเวอร์ที่เชื่อถือได้
- เครื่องมือโฮสต์ใช้นโยบาย DSH หน้าเอนจินให้โหมดอ่าน/เขียนและการอนุมัติครั้งเดียวโดยไม่ข้ามขอบเขต Chat แบบไม่มี UI ปฏิเสธคำถามที่แสดงไม่ได้ ส่วน Work ใช้อนุมัติและคอนเทนเนอร์ของตน ไม่มีเครื่องมือไฟล์โฮสต์
- สตรีมมีข้อความสดและความคิดที่เปิดเผย ข้อความถาวรเก็บผลสุดท้าย ไคลเอนต์ไม่รับข้อความเดิมรอบสอง
- เริ่มใหม่และลบใช้เซสชันที่บันทึก ทั้งเซสชันว่างและเสร็จอยู่ข้าม restart การลบ JSONL ของสะพานเชื่อมหยุด writer และลบไฟล์ ที่เก็บอื่นต้องมีอะแดปเตอร์ลบที่เหมาะสม
- บันทึกเก่าที่ผิดต้องซ่อมอย่างชัดเจน เวอร์ชันก่อนเขียนข้อความไม่มี ID ตัวอ่านเข้มงวดปฏิเสธแทนทิ้ง ดู การแก้ปัญหา
- ชื่อสร้างในเครื่อง ใช้ข้อความมนุษย์แรกเป็นชื่อสั้น เซสชันว่างไม่มีชื่อที่สร้างจากข้อความ
เชื่อมโมเดลจาก DSH ที่กำลังทำงาน
ปลั๊กอินตัวเลือก dsh-native-provider เปิดโมเดลและการเชื่อมต่อผู้ให้บริการที่ตั้งไว้ใน DSH อีกตัว เช่นเว็บแอปในเครื่องพอร์ต 3080 ติดตั้งในโปรไฟล์ที่ใช้อยู่ มันเรียกเฉพาะ ctx.llm คีย์อยู่ใน DSH และการเชื่อมต่อไม่สร้างเซสชัน ไม่รันเอเจนต์ ไม่อ่านไฟล์แนบเนทีฟ และไม่เรียกเครื่องมือเนทีฟ
สองโปรเซสต้องอยู่บนเครื่อง Unix และบัญชี OS เดียวกัน ใช้ Unix socket ที่ระบุชัดในโฟลเดอร์จริงที่บัญชีนั้นเป็นเจ้าของ โหมด 0700 และ socket 0600 ไม่มี TCP listener ใหม่ และไม่ใช้ซ้ำหรือลดความเข้มงวดการยืนยันตัวตนเว็บ DSH ไม่รองรับ Windows หรือ DSH บนเครื่องระยะไกล
บัญชี OS คือขอบเขตในเครื่อง โปรเซสอื่นของบัญชีเดียวกันใช้ socket ได้ จึงไม่ได้ให้ข้อมูลรับรองเนทีฟแยกหรือแยกแอปในบัญชีเดียวกัน
ติดตั้งปลั๊กอินแยก
ใน DSH → Plugins → Add plugin วาง URL สาธารณะนี้ใน Package name or address แล้วกด Install:
https://github.com/libre-webui/dsh-native-provider
เปิดคอมโพเนนต์เมื่อ DSH ขอ แพ็กเกจสาธารณะ 0.1.1 ใบอนุญาต Apache-2.0 มี runtime ที่ build แล้วและ bundle patch ไม่ต้อง build ในเครื่อง รันสคริปต์ติดตั้ง หรือลง runtime dependency npm ชื่อ @libre-webui/dsh-native-provider ไม่ได้เผยแพร่บน npm จึงต้องใช้ GitHub URL
bundle เลือก <DSH home>/lwui-provider/llm.sock ปกติคือ $HOME/.dsh/lwui-provider/llm.sock โดย DSH_HOME ที่ตั้งไว้สำคัญกว่า หากไม่มีโฟลเดอร์ส่วนตัวจะสร้างให้ ใช้หนึ่งสะพานเชื่อมที่ active ต่อ DSH home หรือเปลี่ยน socket ใน cordis.patch.yml ผู้ใช้ของโปรไฟล์อื่น เส้นทางเต็มต้องไม่เกิน 100 ไบต์ UTF-8 และไม่มีส่วน symlink ดูวิธีแทนค่าในคู่มือแพ็กเกจแยก
คำสั่ง CLI ที่ใช้แทนได้:
dsh plugin --profile web add https://github.com/libre-webui/dsh-native-provider
แทน web ด้วยโปรไฟล์ที่กำลังรัน หากติดตั้งผ่าน CLI ให้ restart โปรไฟล์ ส่วน UI ที่ทำงานอยู่เปิดปลั๊กอินได้ทันที ให้ทำตามข้อความแจ้ง restart ของ DSH ไม่ต้องแก้ซอร์ส DSH หรือคัดลอกคีย์
เตรียม bundle จาก Libre WebUI
LWUI มีสคริปต์เตรียมให้ด้วย หากใช้ซอร์ส ให้ build backend แล้วสร้างโฟลเดอร์ผลลัพธ์ใหม่:
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 มี backend ที่ build และสคริปต์แล้ว ให้รันเพียงสองคำสั่งสุดท้ายจากโฟลเดอร์ติดตั้ง จากนั้น restart โปรไฟล์ที่เลือก ทั้งสองวิธีปฏิเสธโฟลเดอร์ผลลัพธ์เดิมและให้ metadata ใบอนุญาตและคำแนะนำติดตั้ง
เชื่อมต่อ Libre WebUI
ตั้ง cordis.config.yml ให้ชี้ socket absolute เดียวกัน สำหรับค่าเริ่มต้นสาธารณะ แทน /absolute/home ด้วย home จริง:
nativeProvider:
socketPath: /absolute/home/.dsh/lwui-provider/llm.sock
หรือใช้ LIBRE_DSH_PROVIDER_SOCKET ค่าว่างในสภาพแวดล้อมปิดการเชื่อมต่อแม้ไฟล์มีเส้นทาง เปิด เอนจิน Cordis ใน LWUI แล้วผู้ดูแลที่ active เลือกโมเดลเนทีฟได้ในเอนจิน DeepSeek Harness ของ Work หน้าเอนจิน และกลุ่มเอเจนต์ Chat ซึ่งต้องเปิด โมเดลเอเจนต์ CLI ด้วย Work เก็บโมเดลดิบและ ID ผู้ให้บริการด้วย providerType: dsh งาน DSH ผ่าน LWUI เดิมคงตัวตนผู้ให้บริการและเครื่องหมายเอนจิน
อ่านแคตตาล็อกเนทีฟแบบสด การเปลี่ยนผู้ให้บริการหรือข้อมูลรับรองทำให้รุ่นการเชื่อมต่อเก่าใช้ไม่ได้และยกเลิกคำขอค้าง หาก socket โมเดล หรือผู้ให้บริการไม่พร้อมจะหยุด ไม่ fallback ไป Ollama หรือที่อื่น ชื่อและสรุปเรียก LLM โดยตรงไม่มีเครื่องมือ การเชื่อมต่อรุ่นแรกนี้รับข้อความ ความคิด และข้อความเครื่องมือ แต่ปฏิเสธการอ้างรูปภาพหรือไฟล์เนทีฟ
ข้อมูลรับรองเป็นของ operator DSH จึงจำกัดการเชื่อมต่อให้ผู้ดูแลแม้ Work ทั่วไปเปิดกว้าง คำขอโมเดลอาจออกจากเครื่องตามผู้ให้บริการ DSH และ Work จะแสดงประกาศระยะไกล ใน team ทุก worker ที่รับงานนี้ต้องเข้าถึงการเชื่อมต่อในเครื่องที่กำหนด หากไม่มีจะไม่อนุญาตรัน ปิด Cordis หรือลบค่า socket จะถอนการใช้เนทีฟแต่เก็บงานไว้ หาก DSH crash แล้วเหลือ socket ให้หยุดเจ้าของและลบเฉพาะ socket เก่าก่อน restart ปลั๊กอินไม่แทนไฟล์ที่มีอยู่
อัปเกรดหรือลบปลั๊กอิน
จบหรือยกเลิกคำขอเนทีฟก่อนเปลี่ยน เพื่อแทน bundle เก่า 0.0.0/0.1.0 ใน UI ให้ Uninstall กลับไป Add plugin แล้วติดตั้ง GitHub URL ด้านบน รักษา socket กำหนดเองผ่าน override โปรไฟล์ที่รองรับ เซสชันและข้อมูลรับรองเนทีฟไม่หาย
การติดตั้งจาก GitHub อัปเดตผ่าน CLI ได้:
dsh plugin --profile web update @libre-webui/dsh-native-provider
หลังอัปเดต CLI ให้ restart และตรวจเวอร์ชัน ปลั๊กอินที่ปิดยังคงปิด ต้องตรวจสถานะก่อนทดสอบ หากต้องตรึงหรือย้อนรุ่น ใช้ github:libre-webui/dsh-native-provider#<commit> bundle ในเครื่องที่ปรับเองต้อง build ลงโฟลเดอร์ใหม่แล้วเพิ่มใหม่ การอัปเดต dependency แบบ local ไม่ดึง GitHub
หากต้องลบการเชื่อมต่อ ให้ลบ nativeProvider.socketPath ของ LWUI หรือกำหนด LIBRE_DSH_PROVIDER_SOCKET เป็นค่าว่างก่อน แล้วรัน:
dsh plugin --profile web remove @libre-webui/dsh-native-provider
restart โปรไฟล์ DSH งาน LWUI ยังอยู่ แต่คำขอเนทีฟล้มเหลวจนกว่าจะคืนการเชื่อมต่อชัดเจนเดิม การลบปลั๊กอินไม่ลบผู้ให้บริการหรือข้อมูลรับรอง DSH ลบโฟลเดอร์ bundle เก่าได้เมื่อไม่มีการติดตั้งใช้งานแล้วเท่านั้น
การใช้ผู้ให้บริการเนทีฟ
คำขอเนทีฟแสดงใน การใช้งานผู้ให้บริการ ใต้ DeepSeek Harness · provider พร้อมโมเดลดิบที่เลือก ทุกคำขอจริงนับหนึ่งครั้ง รวมรอบเครื่องมือ ชื่อ และสรุป แสดงสำเร็จ ล้มเหลว ยกเลิก เวลา และโทเคนที่ DSH รายงาน ข้อมูลเข้าแคชนับครั้งเดียว ถ้าไม่มีค่าการใช้จะคงไม่วัด ไม่ประมาณ ID dsh-native:<percent-encoded-native-provider-id> ใช้กฎราคาและรายงานต้นทุนเดิม หากไม่รู้ราคาให้ถือว่ายังไม่ประเมินราคา
DSH ผ่านผู้ให้บริการ LWUI รักษาระเบียนของผู้ให้บริการ การอ่านแคตตาล็อกและคำขอที่ถูกปฏิเสธก่อนอนุมานไม่สร้างการเรียกเพิ่ม การวัดเริ่มเมื่อติดตั้งรุ่นนี้ ไม่สร้างประวัติสมมติ ข้อมูลที่เก็บมีตัวตน สถานะ เวลา และตัวนับ ไม่มีพรอมต์ คำตอบ คีย์ endpoint หรือข้อความผิดพลาดของผู้ให้บริการ
ตรวจการตั้งค่า
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" }
]
}
503 พร้อม code: CORDIS_UNAVAILABLE หมายถึงโหลดองค์ประกอบไม่สำเร็จ error บอกเหตุผล และ LIBRE_CORDIS_TRACE=true เพิ่มบันทึก Cordis ดูสาเหตุทั่วไปที่ การแก้ปัญหา