ข้ามไปยังเนื้อหาหลัก

เครื่องมือแชต

แชตอนุญาตให้โมเดลเรียกเครื่องมือได้ รอบที่เปิดเครื่องมือจะทำงานเป็นลูป native หลายรอบ โมเดลขอเครื่องมือ Libre WebUI ดำเนินการภายใต้ตัวตนและสิทธิ์ของผู้ใช้ที่เรียก ส่งผลลัพธ์กลับให้โมเดล และทำต่อจนโมเดลตอบ สูงสุดแปดรอบต่อเทิร์นและแปดคำขอต่อรอบ การหยุดจะยกเลิกคำขอโมเดล เครื่องมือที่กำลังทำงาน และการรออนุมัติ

การเรียกเครื่องมือถูกบันทึกเป็นเหตุการณ์มาตรฐาน (chat.tool-call.v1, chat.tool-result.v1, chat.approval.v1) ที่ไหลเหมือนกันผ่านเส้นทาง WebSocket ส่วนตัวและสตรีมเหตุการณ์ถาวร การรีเฟรชหรือเชื่อมต่อใหม่จึงเล่นสถานะเดิมซ้ำ เทิร์นที่เสร็จจะเก็บการเรียกพร้อมตัวอย่างผลลัพธ์แบบจำกัดไว้ในข้อความผู้ช่วย

การเปิดใช้เครื่องมือ

เครื่องมือปิดโดยค่าเริ่มต้น ผู้ดูแลเปิดที่ การตั้งค่า → จัดการผู้ใช้ (เฉพาะผู้ดูแลหรือทุกคน) แต่ละเทิร์นเลือกใช้ผ่านไอคอนประแจในตัวเขียน ซึ่งเปิดตัวเลือกที่มีสวิตช์หลักและช่องเลือกต่อเครื่องมือในตัวและเซิร์ฟเวอร์ที่ลงทะเบียน เทิร์นจึงใช้เฉพาะเครื่องมือที่เลือก ตัวเลือกจำกัดสิ่งที่โปรไฟล์ผูกได้แต่ขยายไม่ได้ แชตส่วนตัว (ไม่ระบุตัวตน) ไม่มีเครื่องมือ เพราะการเรียกเครื่องมือเป็นการกระทำภายนอกและอาจทิ้งการอนุมัติกับบันทึกตรวจสอบ

โปรไฟล์ผู้ช่วย (persona) จำกัดเครื่องมือที่เสนอได้ เซิร์ฟเวอร์เครื่องมือที่ผูก ชุดย่อยเครื่องมือในตัว ทักษะที่ผูก และคอลเลกชันความรู้ที่ผูกจะจำกัดสิ่งที่โมเดลเห็นในเซสชันที่ใช้โปรไฟล์นั้น

เครื่องมือในตัว

แชตมีเครื่องมือของโครงการ 13 รายการ (ทั้งหมดอ่านอย่างเดียว ยกเว้นเครื่องมือเปลี่ยนบันทึกและปฏิทินที่ผ่านขั้นตอนอนุมัติผลข้างเคียง):

  • web_search — เครื่องมือค้นหาที่ผู้ดูแลกำหนด โดยเคารพโหมดสิทธิ์ค้นหาเว็บ
  • search_documents — ค้นหาแบบผสมในเอกสารอัปโหลดและคอลเลกชันความรู้ของผู้ใช้ รวมสิ่งที่แชร์ให้ (การผูกโปรไฟล์จำกัดคอลเลกชันได้) แต่ละข้อความอ้างอิงพร้อมส่วนและตำแหน่งต้นฉบับ
  • list_documents — แสดงเอกสารในขอบเขตแชตพร้อม ID ชนิด และขนาด เพื่อให้โมเดลตัดสินใจว่าจะอ่านอะไร
  • read_document — อ่านช่วงจำกัดของเอกสารที่ใช้ได้ตาม ID และ offset พร้อมป้ายตำแหน่งต้นฉบับ เพื่อไล่ไฟล์ที่การค้นคืนอย่างเดียวตอบไม่ได้
  • load_skill — โหลดคำสั่งทักษะเต็มตาม slug คำอธิบายเครื่องมือมี manifest ทักษะที่เปิดของผู้ใช้ ทักษะจึงโหลดเมื่อโมเดลต้องใช้ หากมีไฟล์ประกอบ คำสั่งจะลงท้ายด้วยรายการไฟล์
  • read_skill_file — อ่านไฟล์ประกอบหนึ่งไฟล์ตาม slug และเส้นทางสัมพัทธ์ เอกสารอ้างอิงขนาดใหญ่จึงไม่ใช้บริบทจนโมเดลเปิดจริง
  • list_notes — แสดงบันทึกของผู้ใช้และที่แชร์พร้อม ID
  • read_note — อ่านเนื้อหาบันทึกเต็มตาม ID
  • create_note — สร้างบันทึก (มีผลข้างเคียง ต้องอนุมัติ)
  • update_note — แทนเนื้อหาบันทึก โดยเก็บสถานะก่อนเป็นรุ่นที่กู้ได้ การแก้ของโมเดลจึงย้อนกลับได้เสมอ (มีผลข้างเคียง ต้องอนุมัติ)
  • list_calendar_events — แสดงกิจกรรมปฏิทินของผู้ใช้ทั้งของตนและที่แชร์ในช่วงมิลลิวินาที epoch
  • create_calendar_event — สร้างกิจกรรมปฏิทิน (มีผลข้างเคียง ต้องอนุมัติ)
  • delete_calendar_event — ลบกิจกรรมตาม ID (มีผลข้างเคียง ต้องอนุมัติ)

เซิร์ฟเวอร์เครื่องมือ

ผู้ดูแลลงทะเบียนเซิร์ฟเวอร์เครื่องมือภายนอกใน การตั้งค่า → เครื่องมือ (เทมเพลตเริ่มต้นจะกรอกแบบฟอร์มไว้ รวม API สาธิตสาธารณะที่ปลอดภัย):

  • OpenAPI: ดึงข้อกำหนด JSON OpenAPI 3.x ครั้งเดียวและตรึงด้วย digest SHA-256 แต่ละการทำงานเป็นเครื่องมือ การทำงาน GET จัดเป็นอ่านอย่างเดียว ส่วนอื่นเป็นผลข้างเคียงจนผู้ดูแลแทนการจัดประเภทต่อเครื่องมือ การดำเนินการสร้างคำขอใหม่จากการทำงานที่ตรึง อาร์กิวเมนต์โมเดลไม่เลือกปลายทาง
  • MCP (HTTP แบบ streaming): ดึงรายการเครื่องมือเซิร์ฟเวอร์ผ่าน JSON-RPC และตรึงแบบเดียวกัน annotations.readOnlyHint ระบุว่าอ่านอย่างเดียว ไม่รองรับเซิร์ฟเวอร์ MCP stdio โดยตั้งใจ เพราะโปรเซสภายนอกไม่รันในโปรเซสเว็บ

รายการที่เปลี่ยนมีผลเมื่อผู้ดูแลรีเฟรชเซิร์ฟเวอร์ ซึ่งเลื่อนรุ่นที่ตรึงและเก็บการแทนต่อเครื่องมือ ความพร้อมต่อเซิร์ฟเวอร์เป็นเฉพาะผู้ดูแล ทุกผู้ใช้ หรือตามสิทธิ์ผ่านโมเดลให้ทรัพยากรร่วม (สิทธิ์ผู้ใช้และกลุ่มบนเซิร์ฟเวอร์)

ข้อมูลประจำตัว

เซิร์ฟเวอร์ที่ต้องยืนยันตัวตนใช้ข้อมูลประจำตัวต่อผู้ใช้ (bearer token หรือ header ที่มีชื่อ) ข้อมูลลับแต่ละรายการเข้ารหัสพร้อมข้อมูลยืนยันเพิ่มเติมที่ผูกกับผู้ใช้และเซิร์ฟเวอร์ตรงกัน ผู้ใช้แต่ละรายป้อนใน การตั้งค่า → เครื่องมือ และไม่แชร์ระหว่างบัญชี

นโยบาย egress

ทุกคำขอเครื่องมือแปลงปลายทางเอง ปฏิเสธพื้นที่ที่อยู่ส่วนตัว loopback และ metadata และตรึงการเชื่อมต่อกับที่อยู่ที่แปลงเพื่อไม่ให้ DNS rebind เปลี่ยนเส้นทาง ปฏิเสธคำตอบ redirect ขนาดคำตอบถูกจำกัดและทุกคำขอมีเวลาหมดอายุเข้มงวด อนุญาตชื่อโฮสต์ภายในตรงได้ด้วย TOOLS_PRIVATE_NETWORK_ALLOWLIST (คั่นจุลภาค) โฮสต์ที่อนุญาตยังถูกตรึงและจำกัด เอาต์พุตเครื่องมือกลับเข้าโมเดลเป็นข้อความที่ไม่น่าเชื่อถือ

การอนุมัติ

เครื่องมืออ่านอย่างเดียวทำงานโดยไม่ถาม เครื่องมือมีผลข้างเคียงจะหยุดเทิร์นและถามผู้ใช้ว่าอนุญาตครั้งเดียว สำหรับแชตนี้ อนุญาตเครื่องมือนี้บนเซิร์ฟเวอร์เสมอ หรือปฏิเสธ การตัดสินใจเป็นแบบถาวร สิทธิ์ "เสมอ" อยู่ผ่านการเริ่มใหม่และถอนได้ใน การตั้งค่า → เครื่องมือ ส่วนคำขอรอจะหมดอายุหลังสองนาทีซึ่งโมเดลเห็นเป็นการปฏิเสธ การปฏิเสธและหมดเวลาไม่ดำเนินคำขอ ทุกการตัดสินใจและคำขอทิ้งเหตุการณ์ตรวจสอบความปลอดภัยที่ตัดข้อมูลแล้ว

ตัวอย่าง

เปิดสวิตช์ประแจในตัวเขียนก่อน ตัวอย่างทั้งหมดด้านล่างเป็นข้อความแชตปกติ

web_search — ค้นข้อมูล

รุ่น SQLite ล่าสุดเปลี่ยนอะไรบ้าง ค้นเว็บก่อนตอบ

โมเดลเรียก web_search ด้วยคำค้นเช่น {"query": "SQLite latest release changelog"} การ์ดคำขอแสดงข้อความผลลัพธ์ที่ได้รับและคำตอบอ้างอิงสิ่งที่พบ ต้องกำหนดค่าการค้นหาเว็บและอนุญาตบัญชีของคุณ

search_documents — ถามเกี่ยวกับไฟล์ของคุณ

อัปโหลด PDF หรือเพิ่มเอกสารในคอลเลกชันความรู้ จากนั้น:

ค้นหาข้อกำหนดการยุติในเอกสารของฉันและยกข้อความตรง ๆ

โมเดลเรียก search_documents ด้วย {"query": "termination clause"} และรับข้อความที่ตรงพร้อมป้ายเอกสารต้นฉบับ คำตอบจึงยกและระบุแหล่งที่มาได้

load_skill — ใช้ทักษะที่บันทึก

สร้างทักษะใน การตั้งค่า → ทักษะ (เช่น $release-notes วิธีที่คุณต้องการเขียนบันทึกรุ่น) แล้ว:

ร่างบันทึกรุ่นสำหรับ diff นี้ด้วย $release-notes

โมเดลเห็นทักษะใน manifest เรียก load_skill {"slug": "release-notes"} เพื่อดึงคำสั่งเต็มและทำตาม การพิมพ์ $ ในตัวเขียนจะเติม slug ทักษะอัตโนมัติ

เซิร์ฟเวอร์ OpenAPI — เช่น API สภาพอากาศ

  1. การตั้งค่า → เครื่องมือ → ลงทะเบียนเซิร์ฟเวอร์: ชื่อ Weather, ชนิด OpenAPI, URL ฐาน https://api.example-weather.dev, URL ข้อกำหนด https://api.example-weather.dev/openapi.json, โหมดยืนยัน bearer

  2. ข้อกำหนดถูกตรึงและการทำงานปรากฏเป็นเครื่องมือ เช่น getForecast (GET, อ่านอย่างเดียว) และ createAlert (POST, ผลข้างเคียง)

  3. ผู้ใช้แต่ละรายบันทึกคีย์ API ของตนในการ์ดเซิร์ฟเวอร์

  4. ในแชต:

    พยากรณ์อากาศมอนทรีออลสุดสัปดาห์นี้เป็นอย่างไร

    โมเดลเรียก weather__getForecast {"city": "Montreal"} และทำงานทันที เครื่องมืออ่านอย่างเดียวไม่ถาม

    แจ้งฉันหากคืนนี้ต่ำกว่า -20

    weather__createAlert มีผลข้างเคียง เทิร์นจึงหยุดพร้อมการ์ดอนุมัติ: อนุญาตครั้งเดียว, อนุญาตสำหรับแชตนี้, อนุญาตเสมอ หรือ ปฏิเสธ จะไม่ส่งอะไรจนคุณเลือก

เซิร์ฟเวอร์ MCP — เช่น ตัวติดตาม issue

  1. การตั้งค่า → เครื่องมือ → ลงทะเบียนเซิร์ฟเวอร์: ชื่อ Issues, ชนิด MCP, URL ฐาน https://mcp.example-tracker.dev/mcp, โหมดยืนยัน header โดยใช้ชื่อ X-Api-Key

  2. รายการเครื่องมือถูกตรึง เครื่องมือที่เซิร์ฟเวอร์ระบุว่าอ่านอย่างเดียว (เช่น search_issues) ทำงานได้อิสระ ส่วนอื่น (เช่น create_issue) ต้องถามก่อน

  3. ในแชต:

    ค้นหา issue เปิดที่กล่าวถึง "database lock" แล้วสร้าง issue ใหม่สรุปรูปแบบ

    issues__search_issues ทำงานทันที ส่วน issues__create_issue แสดงอาร์กิวเมนต์ตรงในการ์ดอนุมัติเพื่อให้อ่านสิ่งที่จะส่งก่อนอนุญาต

ตัวแปรสภาพแวดล้อม

ตัวแปรผล
TOOLS_ACCESS_MODEตรึงฟีเจอร์เครื่องมือเป็น admins หรือ all-users และล็อกสวิตช์ผู้ดูแล
TOOLS_PRIVATE_NETWORK_ALLOWLISTชื่อโฮสต์ตรงที่เซิร์ฟเวอร์เครื่องมือแปลงเป็นที่อยู่ส่วนตัวได้ (รายการจุลภาค)

ขอบเขต

  • การเรียกเครื่องมือทำงานบนเส้นทาง WebSocket (การขนส่งเซสชันส่วนตัวถูกตัดโดยออกแบบ) และเส้นทางสร้างถาวรสำหรับแชตที่เก็บ endpoint REST streaming รุ่นเก่าไม่รันลูปเครื่องมือ
  • เอเจนต์ Work เรียกใช้เซิร์ฟเวอร์เดียวกันผ่านเกตเวย์เดียวกัน เฉพาะการรันที่เปิดเครือข่ายเท่านั้น เซิร์ฟเวอร์ที่ไม่มีข้อมูลรับรองจะถูกกรองออกตั้งแต่ตอนเสนอเครื่องมือ และเครื่องมือที่มีผลข้างเคียงจะถูกกำกับด้วยการอนุมัติของ Work
  • โมเดล Gemini และ CLI เอเจนต์ไม่ได้รับเครื่องมือ ผู้ให้บริการ Ollama, ที่เข้ากันได้กับ OpenAI, Responses-API และ Anthropic ได้รับ
  • เซิร์ฟเวอร์ MCP ยืนยันด้วยข้อมูลประจำตัวคงที่ต่อผู้ใช้ เซิร์ฟเวอร์ที่รองรับเฉพาะ OAuth แบบโต้ตอบยังลงทะเบียนไม่ได้