เอนจิน Strands
Libre WebUI ฝังเอนจินเอเจนต์ที่สร้างบน
Strands Agents harness แบบโอเพนซอร์ส
(@strands-agents/harness 0.1.1 บน @strands-agents/sdk 1.19.0) เอนจินทำงานภายใน
โปรเซส backend ของ Libre WebUI จึงไม่มี daemon แยกที่ต้องติดตั้ง SDK จะถูกโหลดเมื่อมี
การใช้เอนจินเป็นครั้งแรก และเซิร์ฟเวอร์ที่ปิด Strands ไว้จะไม่โหลด SDK เลย
เอนจินขับเคลื่อนโมเดลที่ Libre WebUI ให้บริการอยู่แล้ว:
- โมเดล Ollama เมื่อเปิดใช้ Ollama
- โมเดลจากปลั๊กอินผู้ให้บริการแชตหรือ completion ที่เปิดใช้งานอยู่
การเรียกโมเดลทุกครั้งผ่านบริการ Ollama และปลั๊กอินชุดเดียวกับที่แชตใช้ ไม่มีการตั้งค่า ผู้ให้บริการแยก และไม่มีคีย์ API แยก ข้อมูลรับรองของผู้ให้บริการและสวิตช์ Ollama ยังมีผล เหมือนเดิม
คุณใช้เอนจินนี้ได้สามที่:
- หน้า Strands สำหรับเซสชันเอเจนต์แบบถาวร
- แชท ผ่านรายการ Strands ในตัวเลือกโมเดล
- Work ในฐานะตัวเลือก Strands ของตัวควบคุม เอนจิน ในช่องเขียนงาน
การเข้าถึง
ผู้ดูแลระบบเลือกได้ว่าใครใช้เอนจินได้ที่ การตั้งค่า → จัดการผู้ใช้ → การเข้าถึงและนโยบาย → เอนจิน Strands:
| โหมด | ป้ายในการตั้งค่า | ผู้ที่ใช้ Strands ได้ |
|---|---|---|
disabled | ปิด | ไม่มีใครเลย รวมถึงผู้ดูแลระบบ (ค่าเริ่มต้น) |
admins | ผู้ดูแลระบบ | ผู้ดูแลระบบที่ใช้งานอยู่ |
all-users | ผู้ใช้ทั้งหมด | ทุกบัญชีที่ใช้งานอยู่ |
การเปลี่ยนแปลงมีผลตั้งแต่คำขอถัดไป โดยไม่ต้องรีสตาร์ต
หากต้องการกำหนดโหมดตายตัวในระดับการติดตั้งใช้งาน ให้ตั้งค่า LIBRE_STRANDS_ACCESS:
LIBRE_STRANDS_ACCESS=admins # or disabled, all-users
โหมดที่กำหนดตายตัวจะล็อกตัวควบคุมในหน้าจัดการผู้ใช้ ค่าใดก็ตามที่ไม่ใช่ disabled,
admins หรือ all-users จะล็อกเอนจินให้ปิดอยู่ แทนที่จะย้อนกลับไปใช้การตั้งค่าที่บันทึกไว้
เซิร์ฟเวอร์บังคับใช้โหมดนี้กับทุกคำขอ REST กับแชตผ่าน WebSocket และกับการเรียกโมเดล
ทุกครั้งในการรัน Work หากอ่านโหมดไม่ได้ ระบบจะปฏิเสธการเข้าถึง บัญชีที่ไม่มีสิทธิ์จะไม่เห็น
หน้า Strands รายการ Strands ในแชต หรือเอนจิน Strands ของ Work และ API จะตอบกลับ 403
หน้า Strands
เปิด Strands จากแถบด้านข้าง (/strands)
- เซสชันยังคงอยู่หลังรีสตาร์ต สูงสุด 200 เซสชันต่อบัญชี ข้อความแรกจะใช้ตั้งชื่อ เซสชันใหม่
- เลือกโมเดลให้แต่ละเซสชัน โมเดลเริ่มต้น จะใช้โมเดลแชตเริ่มต้นของคุณ
- คำตอบจะสตรีมออกมาขณะสร้าง พร้อมการใช้เหตุผลของโมเดลและการ์ดสำหรับการเรียก เครื่องมือแต่ละครั้ง
- หยุด จะยกเลิกรอบที่กำลังทำงาน แต่ละเซสชันรันได้ครั้งละหนึ่งรอบ
- การลบเซสชันจะลบประวัติและพื้นที่ทำงานของเซสชันนั้น
แชต
เลือก Strands ในตัวเลือกโมเดล รายการนี้อยู่ในกลุ่ม เอเจนต์ ถัดจากโมเดล เอเจนต์ CLI:
- Strands (
strands) ใช้ค่าเริ่มต้นของเอนจิน ซึ่งก็คือโมเดลแชตเริ่มต้นของคุณ - Strands · โมเดล (ผู้ให้บริการ) (
strands:<route>) ปักหมุดโมเดลหนึ่งตัวพร้อม ผู้ให้บริการของโมเดลนั้นไว้กับบทสนทนา
Strands ในแชตขึ้นอยู่กับสิทธิ์เข้าถึง Strands เท่านั้น ไม่ต้องใช้สวิตช์โมเดลเอเจนต์ CLI และจะแสดงแม้สวิตช์นั้นปิดอยู่ ในแชต เอเจนต์มีเครื่องมือไฟล์ชุดเดียวกับในหน้า Strands ภายในพื้นที่ทำงานส่วนตัวหนึ่งแห่งต่อบัญชี และคำตอบจะมาในรูปข้อความและการใช้เหตุผล ดู ตัวแทนเขียนโค้ดที่ติดตั้งแล้ว สำหรับกลุ่มเอเจนต์ และการใช้รายการ Strands เป็นโมเดลงานสำหรับชื่อเรื่องและสรุปความคิด
Work
ในช่องเขียนงานของ Work ให้เลือก Libre WebUI หรือ Strands ในตัวควบคุม เอนจิน แล้วเลือกโมเดลแยกต่างหาก เมื่อเลือก Strands เอเจนต์ Strands จะวางแผน แต่ละขั้นตอน และ Work จะรันเครื่องมือที่เอเจนต์ร้องขอใน sandbox ของ Work ภายใต้นโยบาย การอนุมัติตามปกติของ Work โดย Work ยังเป็นแหล่งข้อมูลหลักสำหรับบันทึกบทสนทนา การอนุมัติ การรันเครื่องมือ และประวัติการรัน ใน Work เอเจนต์ Strands จะไม่รันเครื่องมือใดของตัวเอง
โมเดลผู้ให้บริการเบื้องหลังต้องรองรับการเรียกใช้เครื่องมือ Work จะตรวจสอบเรื่องนี้ก่อน เริ่มรัน และปฏิเสธโมเดลที่ไม่ได้ประกาศว่ารองรับเครื่องมือ
การรัน Work ที่รุ่นก่อนหน้าบันทึกไว้ด้วยคำนำหน้าโมเดล dsh: จะเปิดเป็นการรัน Strands ดู
Work: เอนจิน Strands ว่าการเลือกเอนจินทำงานร่วมกับ
โมเดลที่ส่งต่อมาจากแชตอย่างไร
โมเดลความปลอดภัย
ในหน้า Strands และในแชต เอเจนต์มีชุดเครื่องมือที่ตั้งใจให้เล็ก:
read,writeและeditสำหรับไฟล์ในพื้นที่ทำงานของเอเจนต์- ปลั๊กอิน
todosของ harness สำหรับวางแผนงานหลายขั้นตอน
เอเจนต์ไม่มี shell ไม่มีการดึงข้อมูลจากเว็บ ไม่มีหน่วยความจำ และไม่มีทักษะ และไม่มีการ
แทรกไฟล์ AGENTS.md ใดลงในคำสั่งของเอเจนต์
แต่ละเซสชันมีไดเรกทอรีพื้นที่ทำงานส่วนตัว ซึ่งเอเจนต์มองเห็นเป็น /workspace ทุกพาธ
จะถูกแปลงหลังจากติดตาม symlink แล้ว และต้องอยู่ภายในไดเรกทอรีนั้น ดังนั้นลิงก์ใน
พื้นที่ทำงานจึงเข้าถึงส่วนอื่นของดิสก์ไม่ได้ และ sandbox จะปฏิเสธการรันคำสั่ง
| รายการ | ขีดจำกัด |
|---|---|
| เซสชันต่อบัญชี | 200 |
| ความยาวพรอมต์ | 32,000 ตัวอักษร |
| จำนวนรอบเอเจนต์ต่อข้อความ | 24 |
| การอ่านหรือเขียนไฟล์ | 2 MB ต่อการเรียก |
| ชื่อเซสชัน | 120 ตัวอักษร |
รอบที่ถึงขีดจำกัดจำนวนรอบจะหยุดและแจ้งให้ทราบ แต่ละรอบอาจเรียกโมเดลของผู้ให้บริการ ได้หลายครั้ง ดังนั้นควรให้สิทธิ์อย่างระมัดระวังเช่นเดียวกับสิทธิ์เข้าถึงโมเดลอื่นที่ใช้ งบประมาณของผู้ให้บริการ
พื้นที่จัดเก็บ
ข้อมูล Strands อยู่ใต้ <DATA_DIR>/strands/ ไม่ได้อยู่ในฐานข้อมูลของแอปพลิเคชัน
แต่ละบัญชีมีไดเรกทอรีของตัวเอง คือ
<DATA_DIR>/strands/users/<account-hash>/ ซึ่งประกอบด้วย:
registry.json: รายการเซสชันของบัญชีsessions/: snapshot ของเซสชัน Strands ที่เอเจนต์ใช้เป็นบริบทtranscripts/: บันทึกบทสนทนาที่แสดงในหน้า Strands สำหรับแต่ละเซสชันworkspaces/: พื้นที่ทำงานส่วนตัวของแต่ละเซสชันchat-workspace/: พื้นที่ทำงานที่ใช้กับรอบในแชต
ใส่ <DATA_DIR>/strands/ ไว้ในข้อมูลสำรองหากเซสชันเหล่านี้สำคัญกับคุณ
การใช้งาน
การใช้งานผู้ให้บริการ (/usage) นับการเรียก Strands ให้กับเอเจนต์ Strands ในส่วน
เอเจนต์ ดู การใช้งานของเอเจนต์
API
ทุกเส้นทางต้องใช้บัญชีที่ยืนยันตัวตนแล้วและมีสิทธิ์เข้าถึง Strands ยกเว้น
/api/strands/access ซึ่งต้องเป็นผู้ดูแลระบบ
| เมธอด | พาธ | วัตถุประสงค์ |
|---|---|---|
GET | /api/strands/access | อ่านโหมดการเข้าถึงและดูว่า LIBRE_STRANDS_ACCESS กำหนดโหมดไว้หรือไม่ (ผู้ดูแลระบบ) |
PUT | /api/strands/access | ตั้ง mode เป็น disabled, admins หรือ all-users (ผู้ดูแลระบบ; 409 หากถูกกำหนดไว้) |
GET | /api/strands/health | สถานะความพร้อมของเอนจิน และเวอร์ชันของ harness และ SDK |
GET | /api/strands/models | โมเดลที่เอนจินขับเคลื่อนได้สำหรับบัญชีนี้ |
GET | /api/strands/sessions | แสดงรายการเซสชัน |
POST | /api/strands/sessions | สร้างเซสชัน (ระบุ title และ model ได้ตามต้องการ) |
GET | /api/strands/sessions/:sessionId | อ่านเซสชัน บันทึกบทสนทนา และดูว่ามีรอบที่กำลังทำงานอยู่หรือไม่ |
PATCH | /api/strands/sessions/:sessionId | เปลี่ยนชื่อหรือโมเดลของเซสชัน |
DELETE | /api/strands/sessions/:sessionId | ลบเซสชันพร้อมบันทึกบทสนทนาและพื้นที่ทำงาน |
POST | /api/strands/sessions/:sessionId/messages | ส่ง { "text": "..." } และสตรีมรอบเป็น NDJSON |
POST | /api/strands/sessions/:sessionId/cancel | หยุดรอบที่กำลังทำงาน |
สตรีมข้อความจะเขียนเหตุการณ์ JSON หนึ่งรายการต่อบรรทัด ได้แก่ turn-start, text,
reasoning, tool-start, tool-result, done (พร้อมเหตุผลที่หยุดและจำนวนโทเค็นที่ใช้
เมื่อผู้ให้บริการรายงาน) และ error การปิดการเชื่อมต่อจะยกเลิกรอบ การส่งข้อความขณะที่มี
รอบกำลังทำงานจะได้ 409
การตั้งค่า
| ตัวแปร | ค่าเริ่มต้น | วัตถุประสงค์ |
|---|---|---|
LIBRE_STRANDS_ACCESS | ไม่ได้ตั้ง (ใช้การตั้งค่าของผู้ดูแลระบบ, admins) | กำหนด disabled, admins หรือ all-users ตายตัว ค่าอื่นใดจะล็อกเอนจินให้ปิดอยู่ |