การยืนยันตัวตน
ทุกคำขอส่ง API key ของคุณในเฮดเดอร์ คีย์เดียวต่อบัญชีใช้ได้กับทุก endpoint และทุกโมเดล ในเฮดเดอร์ได้สองรูปแบบ
เฮดเดอร์ · OpenAI SDK
Authorization: Bearer YOUR_API_KEY เฮดเดอร์ · Anthropic SDK
x-api-key: YOUR_API_KEY เฮดเดอร์ที่รับ
ทั้งสองเฮดเดอร์ถูกอ่านในทุก endpoint ของ /v1 ไม่ว่า endpoint นั้นจะใช้รูปแบบใด ส่งเพียงหนึ่งในสองอย่างนี้
| เฮดเดอร์ | คำอธิบาย |
|---|---|
Authorization: Bearer <key> | ตรวจก่อนเป็นอันดับแรก เขียน Bearer โดยใช้ B ตัวพิมพ์ใหญ่ และเว้นวรรคหนึ่งครั้งก่อนคีย์ OpenAI SDK ส่งเฮดเดอร์นี้ |
x-api-key: <key> | จะถูกอ่านเมื่อคำขอไม่มีเฮดเดอร์ Authorization: Bearer Anthropic SDK ส่งเฮดเดอร์นี้ |
กับ OpenAI SDK ให้ตั้งค่าคีย์และ base URL; SDK จะส่ง Authorization: Bearer
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1"
)
response = client.chat.completions.create(
model="shannon-3",
messages=[
{"role": "user", "content": "Hello, Shannon!"}
]
)
print(response.choices[0].message.content) import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://api.shannon-ai.com/v1'
});
const response = await client.chat.completions.create({
model: 'shannon-3',
messages: [
{ role: 'user', content: 'Hello, Shannon!' }
]
});
console.log(response.choices[0].message.content); curl -X POST "https://api.shannon-ai.com/v1/chat/completions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [
{"role": "user", "content": "Hello, Shannon!"}
]
}' กับ Anthropic SDK ให้ตั้งค่าคีย์และ base URL โดยไม่มี /v1; SDK จะส่ง x-api-key
import anthropic
client = anthropic.Anthropic(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com"
)
message = client.messages.create(
model="shannon-3",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello, Shannon!"}
]
)
print("".join(block.text for block in message.content if block.type == "text")) import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://api.shannon-ai.com'
});
const message = await client.messages.create({
model: 'shannon-3',
max_tokens: 1024,
messages: [
{ role: 'user', content: 'Hello, Shannon!' }
]
});
console.log(message.content.filter((block) => block.type === 'text').map((block) => block.text).join('')); curl -X POST "https://api.shannon-ai.com/v1/messages" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Shannon!"}
]
}' endpoint ใดที่ต้องใช้คีย์
| เอนด์พอยต์ | คีย์ |
|---|---|
POST /v1/chat/completions | จำเป็น |
POST /v1/messages | จำเป็น |
POST /v1/responses | จำเป็น |
POST /v1/tokenize | จำเป็น |
POST /v1/messages/count_tokens | จำเป็น |
GET /v1/models | ไม่ต้องใช้ |
คีย์ของคุณ
- คีย์คือ
sk-ตามด้วยอักขระ 43 ตัวจากA–Z,a–z,0–9,-และ_: รวมทั้งหมด 46 ตัวอักษร - แต่ละบัญชีมีคีย์เพียงหนึ่งอันเท่านั้น คีย์จะถูกสร้างขึ้นเมื่อคุณเปิดหน้าคีย์และการใช้งานเป็นครั้งแรก
- คีย์ให้สิทธิ์เข้าถึง API ได้เต็มรูปแบบสำหรับบัญชีของคุณ: ทุก endpoint ทุกโมเดล และยอดคงเหลือทั้งหมด
- คีย์ไม่มีวันหมดอายุ ใช้งานได้จนกว่าคุณจะหมุนเวียนหรือเพิกถอน
หมุนเวียนและเพิกถอน
คุณหมุนเวียนและเพิกถอนคีย์ได้ที่หน้าคีย์และการใช้งาน คีย์และการใช้งาน
| การดำเนินการ | ผลที่เกิดขึ้น |
|---|---|
| หมุนเวียน | ระบบออกคีย์ใหม่ และคีย์เก่าหยุดทำงาน คีย์ใหม่ใช้งานได้ทันที |
| เพิกถอน | คีย์หยุดทำงานและไม่มีการออกคีย์ใหม่ หมุนเวียนคีย์เพื่อรับคีย์ที่ใช้งานได้อีกครั้ง |
- ทั้งสองอย่างมีผลทันที: คำขอถัดไปที่ใช้คีย์เก่าจะได้รับ
401ให้ถือว่า 60 วินาทีเป็นขีดสูงสุดก่อนที่คีย์เก่าจะถูกปฏิเสธทุกที่ - ไคลเอนต์ทุกตัวของบัญชีใช้คีย์เดียวกัน ดังนั้นการหมุนเวียนคีย์จึงกระทบทั้งหมด ใส่คีย์ใหม่ลงในไคลเอนต์ของคุณทันทีหลังหมุนเวียน
- ยอดคงเหลือ การใช้งาน และ flood protection เป็นของบัญชี ไม่ใช่ของคีย์ คีย์ใหม่ใช้ยอดคงเหลือเดิมและจำนวนคำขอของนาทีปัจจุบันต่อจากเดิม
ข้อผิดพลาด
ความล้มเหลวในการยืนยันตัวตนทุกกรณีมีสถานะ 401 และประเภท authentication_error ข้อความจะบอกว่าเป็นกรณีใด
| สถานะ | ประเภท | ข้อความ | เมื่อไร |
|---|---|---|---|
401 | authentication_error | Missing authentication | คำขอไม่มีทั้งเฮดเดอร์ Authorization: Bearer และเฮดเดอร์ x-api-key ที่ขึ้นต้นด้วย sk- นี่ยังเป็นคำตอบสำหรับ bearer ตัวพิมพ์เล็ก และสำหรับค่า Authorization ที่ไม่มี Bearer ด้วย |
401 | authentication_error | Invalid API key | คีย์ไม่ใช่คีย์ปัจจุบันของบัญชีใดเลย: พิมพ์ผิด ถูกเพิกถอนแล้ว หรือถูกแทนที่จากการหมุนเวียนคีย์ |
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} - ในทุกเส้นทางยกเว้น
/v1/messagesออบเจกต์errorยังมีcode: "invalid_api_key"ด้วย รวมถึงกรณีไม่มีคีย์ และparam: null - ระบบตรวจคีย์ก่อนอ่าน body คำขอที่ไม่มีคีย์ที่ถูกต้องจะได้
401แม้ว่า body จะไม่ถูกต้องหรือใหญ่เกินไป - ค่า
Authorization: Bearerที่ไม่ได้ขึ้นต้นด้วยsk-จะไม่ถูกมองว่าเป็น API key และจะได้401พร้อมข้อความว่า token ไม่ถูกต้องหรือหมดอายุ
เบราว์เซอร์และ CORS
- API ตอบคำขอแบบ cross-origin จากเบราว์เซอร์เฉพาะ origin ที่อยู่ในรายการที่กำหนดไว้ JavaScript บนหน้าของ origin อื่นไม่สามารถอ่านคำตอบของ
/v1ได้ - เรียก API จากเซิร์ฟเวอร์ของคุณ และให้หน้าเว็บของคุณคุยกับเซิร์ฟเวอร์ของคุณ วิธีนี้ยังทำให้คีย์ไม่อยู่ในซอร์สของหน้าเว็บด้วย
- โค้ดฝั่งเซิร์ฟเวอร์และเครื่องมือบรรทัดคำสั่งไม่ได้รับผลกระทบ: กฎนี้บังคับใช้โดยเบราว์เซอร์เท่านั้น
- การลงชื่อเข้าใช้บน shannon-ai.com ไม่ได้ยืนยันตัวตนของคำขอ
/v1ระบบไม่อ่านคุกกี้ที่นั่น คีย์เป็นข้อมูลรับรองเพียงอย่างเดียว - สำหรับ origin ที่ได้รับอนุญาต เบราว์เซอร์ส่ง
content-type,authorization,x-api-key,anthropic-version,anthropic-beta,openai-betaและx-request-idได้ และอ่านเฮดเดอร์คำตอบx-request-idได้
การรักษาคีย์ให้ปลอดภัย
- เก็บคีย์ไว้บนเซิร์ฟเวอร์ อย่าใส่ในหน้าเว็บ แอปมือถือ หรือ repository สาธารณะ: ใครก็ตามที่ถือคีย์นี้ใช้ยอดคงเหลือของคุณได้ทั้งหมด
- โหลดคีย์จากตัวแปรสภาพแวดล้อมหรือที่เก็บความลับ แทนการเขียนลงในโค้ด
- หากคีย์อาจรั่วไหล ให้หมุนเวียนคีย์ในหน้าคีย์และการใช้งาน คีย์เก่าจะหยุดทำงานทันที
- หลังเกิดการรั่วไหล ให้ดูรายการคำขอในหน้าคีย์และการใช้งาน ซึ่งแสดงทุกคำขอที่คีย์ส่งในช่วง 30 วันที่ผ่านมา