เพิ่ม APIsRouter เป็น custom endpoint ของ LibreChat

Updated 2026-07-29

LibreChat ปฏิบัติกับ custom OpenAI-compatible endpoint เป็น feature ชั้นหนึ่ง: หนึ่ง block endpoints.custom ใน librechat.yaml พร้อม baseURL, apiKey และ models.fetch ตั้งเป็น true แล้วทั้งแคตตาล็อกจะปรากฏใน model selector ภายใต้ key เดียว

คำตอบสั้น ๆ: block เดียวใน librechat.yaml

custom endpoint ของ LibreChat ตั้งค่าใน librechat.yaml ใต้ endpoints.custom ซึ่งเป็น array ที่แต่ละ entry คือหนึ่ง provider สามฟิลด์ที่สำคัญคือ name (label ใน endpoint selector), apiKey (ซึ่ง interpolate environment variable ในรูปแบบ ${VARIABLE} ดังนั้น key จึงอยู่ใน .env และไม่เคยอยู่ใน YAML เลย) และ baseURL สำหรับ APIsRouter baseURL คือ https://api.apisrouter.com/v1 โดยรวม /v1 ไว้ด้วย เพราะ LibreChat ต่อ path ของ route อย่าง /chat/completions เข้ากับ base ที่คุณให้ block models ตัดสินว่าอะไรปรากฏใน model dropdown ตั้ง models.fetch เป็น true แล้ว LibreChat จะ query รายการ /v1/models ของ endpoint ตอนโหลด ดังนั้นทุก id ในแคตตาล็อกจะเลือกได้โดยไม่ต้องดูแลรายการที่เขียนด้วยมือ models.default ยังจำเป็นในรูปแบบ array และทำหน้าที่เป็น fallback ที่แสดงก่อนหรือแทนที่การ fetch นี่คือการตั้งค่าที่มีเอกสารรองรับจากต้นทาง ไม่ใช่ patch: โครงสร้าง object ของ custom endpoint ใน docs ของ LibreChat นิยาม key ทุกตัวที่ใช้ที่นี่

version: 1.2.1
endpoints:
  custom:
    - name: "APIsRouter"
      apiKey: "${APISROUTER_API_KEY}"
      baseURL: "https://api.apisrouter.com/v1"
      models:
        default: ["claude-sonnet-4-6"]
        fetch: true

LibreChat route custom endpoint อย่างไร

LibreChat (danny-avila บน GitHub มีดาวราว 41K) คือ interface สไตล์ ChatGPT แบบ self-hosted ที่ถูก deploy กว้างขวางที่สุด: multi-user, multi-model พร้อมการค้นหาบทสนทนา, agent, การจัดการไฟล์ และ key ต่อผู้ใช้ ต่างจาก client ที่ hardcode รายชื่อ provider ไว้ array endpoints.custom ของมันรับ service แบบ OpenAI-compatible ใดก็ได้ และ provider ที่มีชื่อเสียงหลายตัวในเอกสารก็ตั้งค่าผ่านกลไกนี้เป๊ะ ๆ เมื่อผู้ใช้เลือกโมเดลจาก custom endpoint LibreChat จะส่ง request /v1/chat/completions มาตรฐานไปที่ baseURL ของ endpoint นั้น โดยฟิลด์ model เป็นสตริงธรรมดา ไม่มีอะไรใน client ที่สนใจว่าโมเดลถูกฝึกโดย vendor ไหน เมื่อ endpoint หลัง baseURL เสิร์ฟหลาย vendor หนึ่ง entry ใน librechat.yaml จะนำ id ของ Claude, GPT, Gemini, DeepSeek และ GLM มาไว้ใน dropdown เดียวกัน และผู้ใช้สลับ vendor กลางบทสนทนาได้เหมือนสลับระหว่าง GPT สองรุ่น นั่นทำให้การตั้งค่า LibreChat แบบหลาย provider ทั่วไปยุบตัวลง แทนที่จะเป็น custom entry ต่อ vendor แต่ละอันมี key ของตัวเองใน .env และ surface การเก็บเงินของตัวเอง entry เดียวกับ key เดียวครอบคลุมทั้งแคตตาล็อก และ admin เห็น usage ต่อโมเดลในที่เดียว แทนที่จะกระทบยอด dashboard หลายตัว

ตั้งค่าแบบเต็ม: YAML, .env และ Docker mount

สร้าง librechat.yaml ที่ root ของโปรเจกต์แล้วใส่ key ไว้ใน .env การอ้างอิง ${APISROUTER_API_KEY} ใน YAML จะ resolve จาก environment ตอนเริ่มระบบ ดังนั้นไฟล์ config จึง commit ได้ตามปกติ ขั้นตอนที่คนตั้งค่าครั้งแรกมักพลาดคือเรื่อง Docker โดยเฉพาะ: container ไม่เห็น librechat.yaml ของคุณจนกว่าคุณจะ mount มัน เอกสารให้คุณสร้าง docker-compose.override.yml พร้อม bind mount จาก ./librechat.yaml ไปยัง /app/librechat.yaml แล้ว recreate container การแก้ YAML ทีหลังก็ต้อง restart ด้วย เพราะไฟล์ถูกอ่านตอนเริ่มระบบ ไม่ได้ watch ตลอดเวลา มีฟิลด์เสริมสองสามอย่างที่คุ้มค่าจะตั้งบน entry ของ gateway titleConvo เปิดชื่อบทสนทนาอัตโนมัติ และ titleModel เลือกโมเดลที่เขียนชื่อเหล่านั้น ค่าเริ่มต้นที่มีเอกสารรองรับของ titleModel คือ gpt-3.5-turbo ซึ่งเป็น id ที่ endpoint ที่ไม่ใช่ OpenAI อาจไม่เสิร์ฟ ดังนั้นตั้งมันอย่างชัดเจนเป็น id ในแคตตาล็อกที่เร็ว หรือเป็นค่าพิเศษ current_model modelDisplayLabel ควบคุมชื่อที่แสดงบนข้อความของ assistant และ apiKey รับค่าพิเศษ user_provided ได้ถ้าคุณต้องการให้แต่ละผู้ใช้วาง key ของตัวเองแทนที่จะแชร์ key ของ server

version: 1.2.1
endpoints:
  custom:
    - name: "APIsRouter"
      apiKey: "${APISROUTER_API_KEY}"
      baseURL: "https://api.apisrouter.com/v1"
      models:
        default: ["claude-sonnet-4-6", "gpt-5.5", "deepseek-v4-pro"]
        fetch: true
      titleConvo: true
      titleModel: "claude-haiku-4-5-20251001"
      modelDisplayLabel: "APIsRouter"

เลือกโมเดลสำหรับพื้นที่แชทที่ใช้ร่วมกัน

เพราะทุกโมเดลเก็บเงินผ่าน key เดียวกัน วิธีทำงานจริงของ admin คือดู usage หนึ่งสัปดาห์ใน console ดูว่าผู้ใช้เลือกโมเดลไหนจริง ๆ แล้วตัด models.default ให้ตรงกัน โดยยังเปิด fetch ไว้เพื่อให้ power user ยังเข้าถึงรายการเต็มได้

  • แชทประจำวันต้องการ generalist ที่แข็งแกร่ง claude-sonnet-4-6 และ gpt-5.5 แบกบทสนทนายาว, การพูดคุยเรื่องไฟล์ และการรัน agent โดยไม่ต้องกังวลเรื่องโมเดลต่อข้อความ
  • คำถามสั้น ๆ ความถี่สูงคืองานปริมาณมาก claude-haiku-4-5-20251001 และ gemini-3.5-flash ตอบเร็วและป้องกันไม่ให้ deployment หลายผู้ใช้กระจุกค่าใช้จ่ายไว้ที่เทิร์นที่ไม่สำคัญ
  • การสร้างชื่อทำงานทุกบทสนทนา ชี้ titleModel ไปที่ id ที่เร็ว การจ่ายราคาระดับ frontier เพื่อเขียนชื่อหกคำคือความสูญเปล่าเงียบ ๆ ที่พบบ่อยที่สุดใน LibreChat deployment
  • ทีมที่ใช้หลายภาษาควรทดสอบ deepseek-v4-pro และ glm-5.2 บนส่วนผสมภาษาจริงของตัวเอง dropdown หลาย vendor ทำให้มันเป็นการเปรียบเทียบในแอปแทนที่จะเป็นการตั้งค่าใหม่
  • models.fetch หมายความว่าโมเดลใหม่ในแคตตาล็อกปรากฏโดยไม่ต้องแตะ YAML เลย ดังนั้นโมเดลที่เพิ่มจากต้นทางจะเลือกได้ในครั้งถัดไปที่รายการรีเฟรช

จ่ายตามการใช้งาน · ถูกกว่าราคาทางการ

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

โมเดลราคาทางการราคาของเรา
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.00 per M
Claude Haiku 4.5 20251001$1.00 / $5.00 per M$0.80 / $4.00 per M
GPT-5.5$5.00 / $30.00 per M$4.00 / $24.00 per M
Gemini 3.5 Flash$1.50 / $9.00 per M$1.20 / $7.20 per M
DeepSeek V4 Pro$0.43 / $0.87 per M$0.40 / $0.90 per M

รูปแบบความล้มเหลวเฉพาะของ LibreChat

config ไม่โหลดแบบเงียบ ๆ คือกรณีคลาสสิก และเกือบทุกครั้งเป็นเรื่อง Docker mount ถ้าไม่มี bind mount ของ docker-compose.override.yml container จะรันโดยไม่มี librechat.yaml เลย custom endpoint ไม่ปรากฏใน selector และไม่มี error อะไรเลย ยืนยันว่าไฟล์อยู่ใน container ก่อน debug อย่างอื่น apiKey ที่มาถึงตัวจริงเป็น ${APISROUTER_API_KEY} หมายความว่าตัวแปรนั้นไม่มีอยู่ใน environment ที่ server เริ่มด้วย การ interpolate เกิดขึ้นตอนเริ่มระบบจาก .env ดังนั้น key ที่เพิ่มทีหลังต้อง restart container อาการคือ 401 จาก gateway พร้อม bearer token ที่ไร้ความหมาย baseURL ที่ไม่มี /v1 ทำให้เกิด 404 ในทุก request เพราะ LibreChat ต่อ /chat/completions เข้ากับ base ตามที่ให้ ข้อผิดพลาดตรงข้าม การวาง URL แบบ completions เต็มเป็น baseURL เป็นของตัวเลือก directEndpoint แยกต่างหาก และไม่ควรผสมกับ entry ปกติ model dropdown ว่างเปล่าเมื่อปิด fetch หมายความว่า models.default หายไปหรือว่างเปล่า มันเป็น array ที่จำเป็น เมื่อเปิด fetch dropdown ที่ว่างเปล่ามักหมายความว่าการ fetch เองล้มเหลว ซึ่งวนกลับไปที่ key หรือ baseURL และชื่อบทสนทนาที่ล้มเหลวบน endpoint ที่ทำงานได้ปกติ คือค่าเริ่มต้นของ titleModel ที่ชี้ไปที่ id ที่ gateway ไม่เสิร์ฟ ตั้งมันอย่างชัดเจน

ใครที่ใช้ LibreChat ผ่าน gateway

  • ทีมที่ self-host พื้นที่แชทร่วมกันและต้องการ Claude, GPT, Gemini และ DeepSeek ใน dropdown เดียว โดยไม่ต้องดูแล entry endpoints.custom กับบัญชี vendor คนละอันต่อตัว
  • admin ที่รัน deployment หลายผู้ใช้และต้องการ surface usage เดียว log ต่อ key แสดงว่าทีมใช้โมเดลไหนจริง ๆ ตั้งราคาแล้ว โดยไม่ต้องรวม dashboard vendor
  • operator ที่ให้ key ของแผนกตัวเองแยกกัน: YAML เดียวกัน key หนึ่งต่อกลุ่ม และ usage log กลายเป็นรายงานต้นทุนต่อทีม
  • ครัวเรือนและกลุ่มเล็กที่แทนที่ค่าสมาชิกแชทหลายตัวด้วย endpoint แบบมิเตอร์ตัวเดียว จ่ายตาม token ที่ใช้แทนที่จะจ่ายตามที่นั่ง
  • นักพัฒนาที่ไม่มีทางเข้าถึงระบบเก็บเงินของ vendor รายใดรายหนึ่ง การเข้าถึงแบบเติมเงินโดยไม่ต้องใช้บัตรตัดการพึ่งพาการสมัครต่อ provider ออกไป

ตรวจสอบ endpoint และ debug ข้อความแรก

พิสูจน์ฝั่ง gateway ก่อนแตะ LibreChat: ดูรายการโมเดลด้วย key ของคุณ แล้วยืนยันว่า id ที่คุณใส่ใน models.default ปรากฏขึ้น ถ้าใช้ได้ อาการที่เหลือทั้งหมดอยู่ฝั่ง LibreChat จากนั้นเปิด stack แล้วเปิด endpoint selector การที่ entry APIsRouter ปรากฏขึ้นเลยพิสูจน์ว่า YAML โหลดแล้ว รายการโมเดลที่เติมมาพิสูจน์ว่าการ fetch และ key ใช้ได้ คำตอบแรกพิสูจน์ว่า path ของแชทใช้ได้ ทำทีละอย่างตามลำดับแทนที่จะทำพร้อมกันหมด เพราะแต่ละอย่างมีชุดความล้มเหลวต่างกัน คือ mount, env var และ baseURL ตามลำดับ เมื่อข้อความไหลลื่นแล้ว console ของ APIsRouter แสดงโมเดลต่อ request, จำนวน token และค่าใช้จ่าย instance LibreChat ที่ใช้ร่วมกันเป็นแบบ deployment ที่ usage มักกระจุกตัวอยู่ที่สองสามโมเดลเงียบ ๆ และ usage log คือวิธีที่คุณรู้ว่าเป็นตัวไหนก่อนที่ใบแจ้งหนี้จะบอก

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

คำถามที่พบบ่อย

ตั้งค่า custom OpenAI-compatible endpoint ใน LibreChat ที่ไหน?

ใน librechat.yaml ใต้ endpoints.custom ซึ่งเป็น array ของ provider entry ที่มี name, apiKey, baseURL และ block models บนการติดตั้งแบบ Docker ไฟล์ต้องถูก bind mount เข้า container ผ่าน docker-compose.override.yml ไม่งั้นจะถูกเมินแบบเงียบ ๆ

baseURL ควรมี /v1 ไหม?

ใช่สำหรับ APIsRouter: https://api.apisrouter.com/v1 LibreChat ต่อ path ของ route อย่าง /chat/completions เข้ากับ base ตามที่ให้ ดังนั้น /v1 ที่ขาดหายไปจะทำให้เกิด 404 ในทุก request

endpoint เดียวใน LibreChat เสิร์ฟโมเดล Claude, GPT และ DeepSeek พร้อมกันได้ไหม?

ได้ LibreChat ส่งต่อ model id ที่เลือกไว้เป็นสตริงธรรมดาไปที่ baseURL ของ endpoint เมื่อ endpoint เสิร์ฟหลาย vendor หนึ่ง entry endpoints.custom จะนำ id ทั้งหมดมาไว้ใน dropdown เดียวกัน และ models.fetch จะเก็บรายการนั้นให้ทันสมัยอัตโนมัติ

ทำไม custom endpoint ของฉันหายไปจาก selector?

YAML ไม่ได้โหลด บน Docker สาเหตุปกติคือ bind mount ของ librechat.yaml หายไป container รันโดยไม่มีไฟล์และไม่มี error ยืนยันว่าไฟล์อยู่ใน container แล้ว restart เพราะ config ถูกอ่านตอนเริ่มระบบ

ทำไมชื่อบทสนทนาล้มเหลวทั้งที่แชทใช้งานได้?

titleConvo ใช้ titleModel ซึ่งค่าเริ่มต้นที่มีเอกสารระบุคือ gpt-3.5-turbo เป็น id ที่ endpoint ของคุณอาจไม่เสิร์ฟ ตั้ง titleModel อย่างชัดเจนเป็น id ในแคตตาล็อกที่เร็ว เช่น claude-haiku-4-5-20251001 หรือค่าพิเศษ current_model

ให้แต่ละผู้ใช้นำ key ของตัวเองมาแทนที่จะแชร์ key ของ server ได้ไหม?

ได้ ตั้ง apiKey เป็นค่าพิเศษ user_provided แล้ว LibreChat จะขอ key จากผู้ใช้แต่ละคน เก็บไว้ต่อผู้ใช้ ซึ่งเข้ากับ gateway key ได้ดี เพราะ key ต่อผู้ใช้หนึ่งตัวทำให้ usage log กลายเป็นมุมมองต้นทุนต่อคน