TH ▾
รับคีย์ API

API OpenAI สำหรับ LLM ในเครื่อง: รันในเครื่อง, สลับไปใช้แบบโฮสต์ รันในเครื่อง สลับไปโฮสต์

API OpenAI สำหรับ LLM ในเครื่องคือเซิร์ฟเวอร์โมเดลบนเครื่องของคุณเองที่ตอบกลับ HTTP requests เดียวกันที่ SDK ของ OpenAI ส่ง เนื่องจากรูปแบบคำขอเหมือนกัน โค้ดที่คุณเขียนจึงทำงานกับเอนด์พอยต์แบบโฮสต์ได้ และหน้านี้แสดงสิ่งที่สืบทอดมาและสิ่งที่ไม่มี

อัปเดต

คอมพิวเตอร์เดสก์ท็อปและเซิร์ฟเวอร์คลาวด์เชื่อมต่อกันด้วยสายเคเบิลหนึ่งเส้นพร้อมสวิตช์ แสดงเอนด์พอยต์ LLM แบบท้องถิ่นและแบบโฮสต์

ประเด็นสำคัญ

ความหมายของวลีนี้

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

รูปแบบเป็นสัญญาที่เรียบง่าย แอปของคุณส่ง body เป็น JSON ที่มี model และรายการของ messages ซึ่งแต่ละรายการมีบทบาทเป็น system, user หรือ assistant เซิร์ฟเวอร์จะตอบกลับด้วย object JSON ที่เก็บข้อความที่สร้างขึ้นมา หรือส่ง stream ของ chunk เล็กๆ หากคุณขอ streaming SDK ทางการสำหรับ Python และ JavaScript ห่อหุ้มสิ่งนี้ไว้ และอนุญาตให้คุณปรับแต่ง base URL ได้ ซึ่งเป็นจุดสำคัญทั้งหมด

เครื่องมือท้องถิ่นจำนวนมากเปิดเผยสัญญานี้ Ollama, LM Studio, เซิร์ฟเวอร์ llama.cpp และ vLLM ต่างเสนอเส้นทางแบบ OpenAI บริการแบบโฮสต์ก็ทำเช่นกัน นั่นเป็นเหตุผลว่าทำไมโค้ดไคลเอนต์เพียงยี่สิบบรรทัดจึงสามารถสื่อสารกับทั้งสองแบบได้ เอนด์พอยต์บนเว็บไซต์นี้เป็นแบบโฮสต์ มันรองรับ POST /v1/chat/completions และ GET /v1/models และเข้าถึงได้ที่ https://api.onekeyllmapi.com/v1

เปรียบเทียบแบบท้องถิ่นกับแบบโฮสต์อย่างรวดเร็ว

ไม่มีแบบไหนดีกว่าในภาพรวม ทั้งสองแบบแลกเปลี่ยนการควบคุมกับความพยายาม ตารางนี้เน้นเฉพาะความแตกต่างที่ถูกต้องสำหรับหมวดหมู่นี้ ไม่ใช่สำหรับผลิตภัณฑ์เฉพาะใดๆ

คำถามตัวรันแบบท้องถิ่นAPI สไตล์ OpenAI แบบโฮสต์
ที่ที่พรอมต์ถูกส่งไปอยู่บนเครื่องของคุณเดินทางไปยังผู้ให้บริการผ่าน HTTPS
ฮาร์ดแวร์คุณจัดหา GPU หรือ CPU และหน่วยความจำไม่มีฝั่งของคุณ
ขนาดโมเดลจำกัดโดยหน่วยความจำของคุณไม่ว่าผู้ให้บริการจะให้บริการอะไร
โมเดลต้นทุนฮาร์ดแวร์และพลังงานต่อโทเคน จากเครดิตแบบเติมเงินล่วงหน้าที่นี่
ความพร้อมใช้งานตราบใดที่เครื่องของคุณยังเปิดอยู่เซิร์ฟเวอร์ที่เปิดตลอดเวลา ขีดจำกัดแบบแชร์
การตั้งค่าติดตั้ง ดาวน์โหลดน้ำหนัก ปรับแต่งสร้างคีย์ API ตั้งค่า base URL

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

การเปลี่ยนไคลเอนต์จากแบบท้องถิ่นเป็นแบบโฮสต์

หากโค้ดของคุณสื่อสารกับตัวรันแบบท้องถิ่นอยู่แล้ว การย้ายทำได้เพียงสามค่า สิ่งอื่น ๆ รวมถึงวิธีการสร้างข้อความและอ่านชิ้นข้อมูลแบบสตรีม ยังคงเหมือนเดิม

  1. URL ฐาน ใช้ https://api.onekeyllmapi.com/v1 แทนที่อยู่ท้องถิ่นของคุณ
  2. คีย์ API เซิร์ฟเวอร์ท้องถิ่นมักเพิกเฉยต่อคีย์ แบบโฮสต์ต้องการคีย์นี้เป็น Authorization: Bearer <key> และ SDK จะส่งคีย์นี้ให้คุณ
  3. Model ID. ชื่อในเครื่องคือชื่อที่คุณดึงมา ที่นี่ ID คือ uncensored

วิธีที่เรียบร้อยในการรักษาความยืดหยุ่นนี้คือการอ่านค่าทั้งสามจากตัวแปรสภาพแวดล้อม เพื่อให้ไฟล์เดียวใช้งานได้ทั้งสองที่

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.environ.get("LLM_BASE_URL", "https://api.onekeyllmapi.com/v1"),
    api_key=os.environ.get("LLM_API_KEY", "YOUR_KEY"),
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")

models = client.models.list()
print([m.id for m in models.data])

resp = client.chat.completions.create(
    model=MODEL,
    messages=[
        {"role": "system", "content": "Answer in two sentences."},
        {"role": "user", "content": "Why do OpenAI-style endpoints make switching models easy?"},
    ],
    temperature=0.5,
)
print(resp.choices[0].message.content)

การเรียกใช้เดียวกันจาก command line มีประโยชน์สำหรับการทดสอบเบื้องต้นอย่างรวดเร็ว:

curl https://api.onekeyllmapi.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "uncensored", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 20}'

เมื่อใช้ Node รูปแบบจะเหมือนกัน:

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: process.env.LLM_BASE_URL ?? "https://api.onekeyllmapi.com/v1",
  apiKey: process.env.LLM_API_KEY,
});

const res = await client.chat.completions.create({
  model: process.env.LLM_MODEL ?? "uncensored",
  messages: [{ role: "user", content: "Name three uses for JSON mode." }],
});
console.log(res.choices[0].message.content);

สิ่งที่ API ที่เข้ากันได้กับ OpenAI รองรับและไม่รองรับ

คำว่า "เข้ากันได้" หมายถึงรูปแบบการส่งข้อมูลตรงกัน ไม่ได้การันตีว่าฟีเจอร์ทั้งหมดที่บริการต้นฉบับมีจะปรากฏอยู่ ก่อนที่จะย้ายแอปพลิเคชันจริง ควรตรวจสอบรายการเหล่านี้เทียบกับเป้าหมาย

สิ่งที่ API นี้รองรับ

  • Chat completions ที่ POST /v1/chat/completions และรายการโมเดลที่ GET /v1/models
  • สตรีมมิงผ่านเหตุการณ์ที่ส่งจากเซิร์ฟเวอร์ด้วย stream: true พร้อมรายงานการใช้งานที่ท้ายสตรีม
  • การเรียกใช้เครื่องมือผ่าน tools และ tool_choice, ส่ง tool_calls แบบสตรีม และส่งผลลัพธ์กลับเป็นข้อความ role: "tool"
  • โหมด JSON ผ่าน response_format: {"type": "json_object"}
  • การควบคุมการสุ่มตัวอย่าง: temperature, top_p, stop, seed และพารามิเตอร์ penalty จะถูกส่งผ่าน

สิ่งที่ API นี้ไม่ทำ

  • ไม่มีการสร้างภาพ เสียง หรือวิดีโอ เป็นข้อความเท่านั้น
  • ไม่มีเอนด์พอยต์ embeddings และไม่มี การปรับแต่งโมเดล หากแอปของคุณสร้าง vector index คุณต้องใช้แหล่งข้อมูล embeddings แยกต่างหาก
  • มีเพียงโมเดลเดียว โมเดลเป็น โมเดลแบบเปิดน้ำหนัก ที่ให้บริการโดยผู้ให้บริการอิสระ ไม่ใช่ API ทางการของผู้ขายรายใหญ่ใดๆ และไม่ใช่ ตัวเปลี่ยนเส้นทาง ระหว่างผู้ขาย ดังนั้นคุณไม่สามารถเลือกโมเดลจากตระกูลต่างๆ ได้โดยการเปลี่ยน ID

โปรแกรมรันในเครื่องบางครั้งก็แตกต่างในทางตรงกันข้าม เซิร์ฟเวอร์ในเครื่องอาจเสนอ เส้นทาง embeddings หรืออนุญาตให้คุณโหลดโมเดลหลายตัว และขนาดหน้าต่างบริบทคือค่าที่คุณกำหนดเอง อ่านเอกสารเป้าหมายสำหรับแต่ละรายการ และเก็บรายการสั้นๆ ของฟีเจอร์ที่แอปของคุณใช้งานจริง เอกสาร เอกสารเริ่มต้นอย่างรวดเร็ว แสดงฟิลด์คำขอแบบเต็ม

ความแตกต่างของ บริบท ขีดจำกัด และต้นทุน

ตัวเลขสามตัวเปลี่ยนแปลงเมื่อคุณออกจากเซิร์ฟเวอร์ในเครื่อง ตัวแรกคือหน้าต่าง ความยาวบริบทของโปรแกรมรันในเครื่องคือการตั้งค่าที่เชื่อมโยงกับหน่วยความจำของคุณ ที่นี่กำหนดไว้ที่ 100,000 โทเคน แบ่งปันระหว่างพรอมต์และการสร้างข้อความ และ max_tokens เป็นค่าเลือกได้ ตัวที่สองคือความสามารถในการรองรับการทำงานพร้อมกัน เครื่องของคุณเองสามารถเข้าคิวได้ลึกเท่าที่คุณต้องการ แต่คีย์เต็มที่นี่อนุญาตให้ทำคำขอพร้อมกันได้ 8 คำขอและ 300 คำขอต่อนาที และคีย์ทดลองใช้ทำได้ 2 และ 60 ตัวที่สามคือค่าใช้จ่าย

การใช้งานแบบโฮสต์มีค่าใช้จ่าย $0.15 ต่อ 1M input tokens และ $0.50 ต่อ 1M output tokens จ่ายตามการใช้งานจากเครดิตแบบเติมเงินล่วงหน้า ลองทำ daily job เป็นตัวอย่าง: เครื่องสรุปข้อความประมวลผลเอกสาร 400 ฉบับต่อวัน แต่ละฉบับมี input 3,000 โทเคน และ output 300 โทเคน Input คือ 400 x 3,000 = 1,200,000 โทเคน ซึ่งมีค่าใช้จ่าย 1.2 x $0.15 = $0.18 Output คือ 400 x 300 = 120,000 โทเคน ซึ่งมีค่าใช้จ่าย 0.12 x $0.50 = $0.06 รวมรายวันคือ $0.24 และรายเดือน 30 วันคือ $7.20 เปรียบเทียบสิ่งนี้กับค่าใช้จ่ายในการเปิดใช้งาน GPU และค่าการ์ดเองก่อนตัดสินใจ

เมื่อคุณเกินขีดจำกัด API จะตอบกลับ HTTP 429 พร้อม code rate_limited หรือ concurrency สำหรับการ overload แบบสั้น ๆ จะเพิ่ม Retry-After: 5 เก็บ logic การ retry ที่รอและลองอีกครั้ง คำขอที่ล้มเหลวหรือถูกปฏิเสธจะไม่ถูกเรียกเก็บเงิน เครดิตไม่มีวันหมดอายุ ดังนั้นเดือนที่ว่างจึงไม่มีค่าใช้จ่าย

คำขอแบบสตรีมจะคง slot concurrency ไว้จนกว่าสตรีมจะสิ้นสุด ดังนั้นให้ปิดสตรีมที่คุณหยุดอ่าน การเติมเงินเริ่มต้นที่ $20; ระดับและโบนัสอยู่ที่ หน้ากำหนดราคา

การแก้ไขข้อผิดพลาดเมื่อการสลับทำงานผิดปกติ

การย้ายที่ล้มเหลวส่วนใหญ่เกิดจากสาเหตุไม่กี่ประการ ลองตรวจสอบตามลำดับนี้

  • 404 หรือข้อผิดพลาดการเชื่อมต่อ URL พื้นฐานอาจขาด ส่วนต่อท้าย /v1 หรือมี path เพิ่มเติม ใช้ให้ตรงกับ https://api.onekeyllmapi.com/v1
  • ข้อผิดพลาดการตรวจสอบสิทธิ์ คีย์หายไปหรือส่งในส่วนหัวที่ไม่ถูกต้อง รูปแบบคือ Authorization: Bearer <key> ผู้ใช้ SDK ควรยืนยันว่าตัวแปรสภาพแวดล้อมโหลดแล้วจริง
  • ไม่พบโมเดล ชื่อโมเดลในเครื่องเก่ายังคงอยู่ใน config ของคุณ เรียก GET /v1/models และใช้ ID ที่รายการระบุ ซึ่งคือ uncensored
  • 429 เมื่อโหลดสูง คุณเกิน 8 คำขอพร้อมกันหรือ 300 ต่อนาทีบนคีย์เต็ม เพิ่มคิวหรือตัวควบคุม
  • พารามิเตอร์ดูเหมือนถูกละเลย ตรวจสอบว่าเป็นฟิลด์ที่ส่งผ่านตามรายการด้านบน และเปรียบเทียบพฤติกรรมด้วย seed ค่าคงที่และอุณหภูมิต่ำ

ทุกการตอบกลับมีเฮดเดอร์ X-Request-Id บันทึกค่านี้ไว้ข้าง ID คำขอของคุณเองเพื่อใช้ติดตามปัญหาได้ภายหลัง หากใช้งานระดับโปรดักชันและต้องการวัดคุณภาพตามเวลา บทความ LLM Observability: Myths vs Facts เป็นบทความแนะนำเพิ่มเติม ส่วนเฮดเดอร์ X-Balance-USD, X-RateLimit-Limit-Requests และ X-RateLimit-Limit-Concurrency ก็ควรบันทึกไว้เช่นกัน

ลองใช้งานโดยไม่ต้องผูกมัด

วิธีที่ถูกที่สุดในการทดสอบว่าโค้ดของคุณพอร์ตได้สะอาดคือการทำงานหนึ่งครั้ง สร้างบัญชีกับ Google หรืออีเมลและรหัสผ่าน แล้วขอเครดิตทดลองใช้ $0.50 จากหน้าคีย์ ใช้คลิกเดียว ไม่ต้องใช้บัตร จำกัดหนึ่งต่อคน และใช้ได้ 7 วัน รับคีย์ของคุณที่ หน้าคีย์ API ตั้งค่าตัวแปรสภาพแวดล้อมสามค่าจากด้านบนและรันชุดทดสอบที่มีอยู่

หากการทดสอบผ่านและการใช้งานสอดคล้องกับงบประมาณของคุณ ให้เติมเงินตั้งแต่ $20 ด้วยบัตร (Visa, Mastercard, Apple Pay, Google Pay) หรือคริปโต (USDT บน TRC20, USDC บน Base) พรอมต์ไม่ถูกใช้ในการฝึก โมเดลได้รับการปรับแต่งให้ตอบโดยไม่มีการปฏิเสธเนื้อหาสำหรับการใช้งานผู้ใหญ่ที่ถูกต้องตามกฎหมาย โดยมีกฎเดียวที่ตรึงไว้: ไม่มีเนื้อหาทางเพศที่เกี่ยวข้องกับผู้เยาว์

ถาม-ตอบ

ฉันสามารถรัน LLM ในเครื่องด้วย API ที่เข้ากันได้กับ OpenAI ได้หรือไม่

ได้ ผู้ให้บริการเช่น Ollama, LM Studio, เซิร์ฟเวอร์ llama.cpp และ vLLM สามารถเปิดใช้งานเอนด์พอยต์ในรูปแบบ OpenAI ได้ จากนั้นคุณสามารถชี้ไปที่ที่อยู่ในเครื่องนั้นด้วย OpenAI SDK

ฉันต้องเปลี่ยนอะไรเพื่อย้ายแอปของฉันไปยัง API แบบโฮสต์นี้

มีสามค่า: Base URL, คีย์ API และ ID โมเดล โดย Base URL คือค่าที่แสดงในตัวอย่าง คีย์ Bearer คือคีย์จากบัญชีของคุณ และ ID โมเดลคือ uncensored

API นี้รองรับ embeddings หรือการสร้างภาพหรือไม่

ไม่ รองรับเฉพาะข้อความ พร้อมฟีเจอร์การตอบกลับแบบแชท, สตรีมมิง, การเรียกใช้ฟังก์ชัน และโหมด JSON ใช้บริการแยกต่างหากสำหรับการฝังหรือภาพ

นี่คือ API ทางการของ vendor โมเดลหรือไม่

ไม่ รองรับโมเดลแบบเปิดน้ำหนักเพียงหนึ่งตัวที่รันโดยผู้ให้บริการอิสระ และไม่ใช่ระบบเราเตอร์ระหว่างซัพพลายเออร์

คีย์ของคุณอยู่ห่างแค่แบบฟอร์มเดียว

สร้างบัญชี คัดลอกคีย์ และเปลี่ยน base URL นั่นคือการตั้งค่าทั้งหมด