Mulai cepat
Buat permintaan pertama: dapatkan kunci Anda, kirim satu pesan, dan baca balasannya. API ini memakai format OpenAI dan Anthropic, jadi SDK yang sudah Anda pakai berfungsi setelah Anda mengganti base URL dan kuncinya.
1. Dapatkan kunci Anda
Setiap akun memiliki satu kunci API. Masuk, buka Keys & usage, dan salin. Kunci berfungsi pada setiap endpoint dan setiap model. Keys & usage
2. Arahkan klien Anda ke API
Semua endpoint berada di bawah satu base URL. SDK OpenAI memakainya dengan /v1 di akhir; SDK Anthropic memakainya tanpa itu, karena ia menambahkan /v1/messages sendiri.
| Klien | Base URL |
|---|---|
| SDK OpenAI dan klien yang kompatibel dengan OpenAI | https://api.shannon-ai.com/v1 |
| SDK Anthropic | https://api.shannon-ai.com |
Tiga endpoint menghasilkan teks. Ketiganya menjangkau model yang sama; pilih yang formatnya sudah dipakai kode Anda.
| Endpoint | Format |
|---|---|
POST /v1/chat/completions | OpenAI Chat Completions |
POST /v1/messages | Anthropic Messages |
POST /v1/responses | OpenAI Responses |
3. Kirim permintaan pertama
Kirim satu pesan user ke shannon-3 pada endpoint Chat Completions. Ganti YOUR_API_KEY dengan kunci Anda.
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
}' | Field | Tipe | Default | Deskripsi |
|---|---|---|---|
model | string | Id model yang menjawab. Id tercantum di Models & pricing. | |
messages | array | Percakapan sejauh ini: objek dengan role dan content. Pesan user terakhir adalah prompt. Wajib. | |
max_tokens | integer | 4096 | Anggaran output permintaan, dari 1 sampai 65,536. Permintaan mencadangkan jumlah ini dari saldo Anda dan ditagih sesuai yang benar-benar dipakai. |
stream | boolean | false | true mengirim jawaban sepotong demi sepotong saat ditulis. |
Body permintaan adalah JSON dan memerlukan header Content-Type: application/json. Daftar lengkap field ada di halaman endpoint. Chat Completions
Balasannya
Panggilan tanpa stream mengembalikan satu objek JSON ketika jawaban selesai. Teks dan angka di bawah ini adalah contoh.
{
"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
}
} | Field | Tipe | Deskripsi |
|---|---|---|
id | string | chatcmpl- diikuti 32 karakter heksadesimal. |
object | string | Selalu chat.completion. |
created | integer | Waktu balasan dalam detik Unix. |
model | string | Id model yang menjawab sebagaimana dipublikasikan, juga ketika Anda mengirim alias atau ejaan lain. |
choices | array | Selalu satu entri, dengan index 0. |
choices[0].message.role | string | Selalu assistant. |
choices[0].message.content | string | null | Jawabannya. Bisa null ketika balasan membawa tool_calls. |
choices[0].message.reasoning_content | string | null | Penalaran model sebelum jawabannya, atau null jika tidak ada. |
choices[0].message.tool_calls | array | Hanya ada ketika model memanggil salah satu tool yang Anda deklarasikan. |
choices[0].finish_reason | string | stop untuk jawaban, tool_calls ketika model memanggil tool. |
usage.prompt_tokens | integer | Token yang dibaca model untuk jawaban ini. Pada shannon-2-* dan keluarga Shannon 3, ini bisa lebih banyak daripada teks yang Anda kirim. |
usage.completion_tokens | integer | Token yang ditulis model. |
usage.total_tokens | integer | Totalnya. Biaya model Shannon dihitung dari angka ini. |
-
usageberisi jumlah token, bukan uang. Apa yang diambil panggilan dari saldo Anda ditampilkan per permintaan di Keys & usage; cara penghitungannya ada di Limits and balance. Batas dan saldo - Setiap balasan, termasuk error dan stream, memiliki header
x-request-id. Jika permintaan Anda membawa headerx-request-id, nilainya dikembalikan; jika tidak, nilainya 12 karakter heksadesimal. Simpan di log Anda: ia menamai satu permintaan ini.
Panggilan yang sama sebagai stream
Setel stream ke true untuk membaca jawaban saat ditulis. Semua hal lain dalam permintaan tetap sama.
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
}' Setiap frame stream adalah satu baris yang diawali data: dan berisi objek JSON. Satu frame, dicetak dalam beberapa baris:
{
"id": "chatcmpl-9b2f6c1e4a7d4f0f8a3c5d2e1b6a7c90",
"object": "chat.completion.chunk",
"created": 1791590400,
"model": "shannon-3",
"choices": [
{
"index": 0,
"delta": {
"content": "Hello! "
},
"finish_reason": null
}
]
} | Frame, berurutan | delta | finish_reason |
|---|---|---|
| Selama model bernalar. Nol frame atau lebih. | {"reasoning_content": "…"} | null |
| Jawabannya, sepotong demi sepotong. Nol frame atau lebih. | {"content": "…"} | null |
Frame JSON terakhir. Frame ini juga membawa usage; Anda tidak perlu memintanya. | {} | "stop" |
Akhir stream: baris data: [DONE]. |
- Balasan berstatus
200dancontent-type: text/event-stream. Setiap frame adalah satu barisdata: <json>diikuti baris kosong. - Baris
: pingdatang setiap 15 detik. Itu komentar yang menjaga koneksi tetap terbuka; klien SSE melewatinya. - Kegagalan setelah stream terbuka datang sebagai frame
data: {"error": {…}}. Statusnya tetap200, jadi periksa frame-nya.
Jika panggilan gagal
Error adalah objek JSON dengan error yang berisi type dan message. Berikut balasan yang paling sering ditemui pada panggilan pertama.
| Status | Tipe | Pesan | Artinya |
|---|---|---|---|
401 | authentication_error | Missing authentication | Tidak ada kunci yang sampai ke API. Kirim Authorization: Bearer diikuti kunci Anda. |
401 | authentication_error | Invalid API key | Kunci bukan kunci akun yang berlaku saat ini. Salin lagi dari Keys & usage. |
400 | invalid_request_error | unknown model: <id> | model bukan id yang dipublikasikan. Gunakan id dari Models & pricing. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type… | Sebuah field bertipe JSON salah, atau messages hilang. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | Anggaran output permintaan tidak muat dalam saldo Anda. |
Selanjutnya ke mana
- Model & harga — Pilih model: id, jendela konteks, dan harga.
- Chat Completions — Setiap field permintaan, field balasan, dan event stream dari endpoint yang Anda panggil.
- Streaming — Frame stream, baris keep-alive, dan error di dalam stream.
- Pemanggilan fungsi — Biarkan model memanggil fungsi Anda.
- Batas dan saldo — Apa yang dicadangkan dan dibiayai suatu permintaan, dan berapa banyak permintaan yang boleh Anda kirim.
- Playground API — Coba permintaan di browser dengan kunci Anda.