เริ่มต้นอย่างรวดเร็ว
ส่งคำขอแรก: รับคีย์ ส่งหนึ่งข้อความ และอ่านคำตอบ API ใช้รูปแบบของ OpenAI และ Anthropic ดังนั้น SDK ที่คุณใช้อยู่แล้วจะทำงานได้หลังจากเปลี่ยน base URL และคีย์
1. รับคีย์ของคุณ
ทุกบัญชีมี API key หนึ่งคีย์ ลงชื่อเข้าใช้ เปิดหน้าคีย์และการใช้งาน แล้วคัดลอก คีย์ใช้ได้กับทุก endpoint และทุกโมเดล คีย์และการใช้งาน
2. ชี้ไคลเอนต์ของคุณไปที่ API
ทุก endpoint อยู่ภายใต้ base URL เดียว OpenAI SDK ใช้โดยต่อท้ายด้วย /v1 ส่วน Anthropic SDK ใช้โดยไม่มี เพราะ SDK เพิ่ม /v1/messages เอง
| ไคลเอนต์ | Base URL |
|---|---|
| OpenAI SDK และไคลเอนต์ที่เข้ากันได้กับ OpenAI | https://api.shannon-ai.com/v1 |
| Anthropic SDK | https://api.shannon-ai.com |
มีสาม endpoint ที่สร้างข้อความ ทั้งหมดเข้าถึงโมเดลชุดเดียวกัน เลือกอันที่มีรูปแบบตรงกับที่โค้ดของคุณใช้อยู่แล้ว
| เอนด์พอยต์ | รูปแบบ |
|---|---|
POST /v1/chat/completions | OpenAI Chat Completions |
POST /v1/messages | Anthropic Messages |
POST /v1/responses | OpenAI Responses |
3. ส่งคำขอแรก
ส่งข้อความ user หนึ่งข้อความไปยัง shannon-3 บน endpoint Chat Completions แทนที่ YOUR_API_KEY ด้วยคีย์ของคุณ
POST https://api.shannon-ai.com/v1/chat/completions
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!"}
],
max_tokens=1024
)
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!' }
],
max_tokens: 1024
});
console.log(response.choices[0].message.content); package main
import (
"context"
"fmt"
openai "github.com/sashabaranov/go-openai"
)
func main() {
config := openai.DefaultConfig("YOUR_API_KEY")
config.BaseURL = "https://api.shannon-ai.com/v1"
client := openai.NewClientWithConfig(config)
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: "shannon-3",
Messages: []openai.ChatCompletionMessage{
{Role: "user", Content: "Hello, Shannon!"},
},
MaxTokens: 1024,
},
)
if err != nil {
panic(err)
}
fmt.Println(resp.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!"}
],
"max_tokens": 1024
}' | ฟิลด์ | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
model | string | id ของโมเดลที่ตอบ รายการ id อยู่ในหน้าโมเดลและราคา | |
messages | array | บทสนทนาจนถึงตอนนี้: ออบเจ็กต์ที่มี role และ content ข้อความ user ล่าสุดคือ prompt จำเป็นต้องมี | |
max_tokens | integer | 4096 | งบเอาต์พุตของคำขอ ตั้งแต่ 1 ถึง 65,536 คำขอจะจองจำนวนนี้จากยอดคงเหลือของคุณ และคิดเงินตามที่ใช้จริง |
stream | boolean | false | true ส่งคำตอบทีละส่วนขณะที่เขียน |
body ของคำขอเป็น JSON และต้องมีเฮดเดอร์ Content-Type: application/json รายการฟิลด์ทั้งหมดอยู่ในหน้าของ endpoint Chat Completions
คำตอบ
การเรียกที่ไม่มี stream จะคืนออบเจ็กต์ JSON หนึ่งรายการเมื่อคำตอบสมบูรณ์ ข้อความและตัวเลขด้านล่างเป็นตัวอย่าง
{
"id": "chatcmpl-9b2f6c1e4a7d4f0f8a3c5d2e1b6a7c90",
"object": "chat.completion",
"created": 1791590400,
"model": "shannon-3",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! What would you like to work on?",
"reasoning_content": "A greeting. A short, friendly reply fits."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1386,
"completion_tokens": 74,
"total_tokens": 1460
}
} | ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | string | chatcmpl- ตามด้วยอักขระเลขฐานสิบหก 32 ตัว |
object | string | เป็น chat.completion เสมอ |
created | integer | เวลาของคำตอบเป็นวินาทีแบบ Unix |
model | string | id ที่เผยแพร่ของโมเดลที่ตอบ แม้คุณจะส่ง alias หรือการสะกดแบบอื่นมา |
choices | array | มีหนึ่งรายการเสมอ โดย index เป็น 0 |
choices[0].message.role | string | เป็น assistant เสมอ |
choices[0].message.content | string | null | คำตอบ อาจเป็น null เมื่อคำตอบมี tool_calls |
choices[0].message.reasoning_content | string | null | การให้เหตุผลของโมเดลก่อนคำตอบ หรือ null เมื่อไม่มี |
choices[0].message.tool_calls | array | มีเฉพาะเมื่อโมเดลเรียกหนึ่งใน tool ที่คุณประกาศ |
choices[0].finish_reason | string | stop สำหรับคำตอบ tool_calls เมื่อโมเดลเรียก tool |
usage.prompt_tokens | integer | tokens ที่โมเดลอ่านสำหรับคำตอบนี้ บน shannon-2-* และตระกูล Shannon 3 อาจมากกว่าข้อความที่คุณส่ง |
usage.completion_tokens | integer | tokens ที่โมเดลเขียน |
usage.total_tokens | integer | ผลรวม ค่าใช้จ่ายของโมเดล Shannon คำนวณจากตัวเลขนี้ |
-
usageเก็บจำนวน tokens ไม่ใช่จำนวนเงิน สิ่งที่การเรียกหักจากยอดคงเหลือของคุณแสดงแยกตามคำขอในหน้าคีย์และการใช้งาน วิธีคำนวณอยู่ในหน้าขีดจำกัดและยอดคงเหลือ ขีดจำกัดและยอดคงเหลือ - ทุกคำตอบ รวมทั้งข้อผิดพลาดและสตรีม มีเฮดเดอร์
x-request-idหากคำขอของคุณมีเฮดเดอร์x-request-idค่านั้นจะถูกส่งกลับ มิฉะนั้นค่าเป็นอักขระเลขฐานสิบหก 12 ตัว เก็บไว้ในล็อกของคุณ: ค่านี้ระบุคำขอนี้คำขอเดียว
การเรียกเดียวกันแบบสตรีม
ตั้ง stream เป็น true เพื่ออ่านคำตอบขณะที่กำลังเขียน ส่วนอื่นของคำขอเหมือนเดิมทุกอย่าง
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1"
)
stream = client.chat.completions.create(
model="shannon-3",
messages=[
{"role": "user", "content": "Hello, Shannon!"}
],
max_tokens=1024,
stream=True
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True) import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://api.shannon-ai.com/v1'
});
const stream = await client.chat.completions.create({
model: 'shannon-3',
messages: [
{ role: 'user', content: 'Hello, Shannon!' }
],
max_tokens: 1024,
stream: true
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
} curl -N -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!"}
],
"max_tokens": 1024,
"stream": true
}' แต่ละเฟรมของสตรีมเป็นหนึ่งบรรทัดที่ขึ้นต้นด้วย data: และมีออบเจ็กต์ JSON หนึ่งเฟรม พิมพ์เป็นหลายบรรทัด:
{
"id": "chatcmpl-9b2f6c1e4a7d4f0f8a3c5d2e1b6a7c90",
"object": "chat.completion.chunk",
"created": 1791590400,
"model": "shannon-3",
"choices": [
{
"index": 0,
"delta": {
"content": "Hello! "
},
"finish_reason": null
}
]
} | เฟรม ตามลำดับ | delta | finish_reason |
|---|---|---|
| ขณะที่โมเดลให้เหตุผล ศูนย์เฟรมหรือมากกว่า | {"reasoning_content": "…"} | null |
| คำตอบ ทีละส่วน ศูนย์เฟรมหรือมากกว่า | {"content": "…"} | null |
เฟรม JSON สุดท้าย มี usage ด้วย ไม่ต้องร้องขอ | {} | "stop" |
จุดสิ้นสุดของสตรีม: บรรทัด data: [DONE] |
- คำตอบมีสถานะ
200และcontent-type: text/event-streamทุกเฟรมเป็นบรรทัดdata: <json>ตามด้วยบรรทัดว่าง - บรรทัด
: pingจะมาทุก 15 วินาที เป็นคอมเมนต์ที่เปิดการเชื่อมต่อค้างไว้ ไคลเอนต์ SSE จะข้ามไป - ความล้มเหลวหลังจากสตรีมเปิดแล้วจะมาถึงเป็นเฟรม
data: {"error": {…}}สถานะยังคงเป็น200ดังนั้นให้ตรวจเฟรมด้วย
หากการเรียกล้มเหลว
ข้อผิดพลาดคือออบเจ็กต์ JSON ที่มี error ซึ่งเก็บ type และ message นี่คือคำตอบที่การเรียกครั้งแรกพบบ่อยที่สุด
| สถานะ | ประเภท | ข้อความ | ความหมาย |
|---|---|---|---|
401 | authentication_error | Missing authentication | ไม่มีคีย์ไปถึง API ให้ส่ง Authorization: Bearer ตามด้วยคีย์ของคุณ |
401 | authentication_error | Invalid API key | คีย์ไม่ใช่คีย์ปัจจุบันของบัญชีใด ให้คัดลอกใหม่จากหน้าคีย์และการใช้งาน |
400 | invalid_request_error | unknown model: <id> | model ไม่ใช่ id ที่เผยแพร่ ให้ใช้ id จากหน้าโมเดลและราคา |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type… | ฟิลด์มีชนิด JSON ไม่ถูกต้อง หรือขาด messages |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | งบเอาต์พุตของคำขอไม่พอดีกับยอดคงเหลือของคุณ |
ไปต่อที่ไหน
- โมเดลและราคา — เลือกโมเดล: id, context window และราคา
- Chat Completions — ทุกฟิลด์ของคำขอ ฟิลด์ของคำตอบ และ stream event ของ endpoint ที่คุณเรียก
- สตรีมมิง — เฟรมของสตรีม บรรทัด keep-alive และข้อผิดพลาดภายในสตรีม
- การเรียกฟังก์ชัน — ให้โมเดลเรียกฟังก์ชันของคุณ
- ขีดจำกัดและยอดคงเหลือ — สิ่งที่คำขอจองและค่าใช้จ่าย และส่งคำขอได้กี่รายการ
- สนามทดลอง API — ลองส่งคำขอในเบราว์เซอร์ด้วยคีย์ของคุณ