クイックスタート
最初のリクエストを送信します:キーを取得し、メッセージをひとつ送信して、応答を読みます。この API は OpenAI と Anthropic の形式に対応しているため、すでに使っている SDK は、ベース URL とキーを変更するだけで動作します。
1. キーを取得する
アカウントごとに API キーがひとつあります。サインインして、キーと使用量を開き、コピーしてください。キーはすべてのエンドポイントとモデルで使えます。 キーと使用量
2. クライアントを API に向ける
すべてのエンドポイントは、単一のベース URL の下にあります。OpenAI SDK では末尾に /v1 を付けて指定します。Anthropic SDK は自分で /v1/messages を付け足すため、付けずに指定します。
| クライアント | ベース URL |
|---|---|
| OpenAI SDK と OpenAI 互換クライアント | https://api.shannon-ai.com/v1 |
| Anthropic SDK | https://api.shannon-ai.com |
テキストを生成するエンドポイントは三つあります。どれも同じモデルに到達します。お使いのコードがすでに使っている形式のものを選んでください。
| エンドポイント | 形式 |
|---|---|
POST /v1/chat/completions | OpenAI Chat Completions |
POST /v1/messages | Anthropic Messages |
POST /v1/responses | OpenAI Responses |
3. 最初のリクエストを送信する
Chat Completions エンドポイントの shannon-3 に、user メッセージをひとつ送信します。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 メッセージがプロンプトです。必須。 | |
max_tokens | integer | 4096 | リクエストの出力バジェット(1〜65,536)。リクエストはこの量を残高から確保し、実際に使った分だけ課金されます。 |
stream | boolean | false | true を指定すると、回答が書かれるそばから少しずつ送信されます。 |
リクエストボディは JSON で、Content-Type: application/json ヘッダーが必要です。フィールドの全一覧は、エンドポイントのページにあります。 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。エイリアスや別の表記で送信した場合も同じです。 |
choices | array | 常にエントリはひとつで、index は 0 です。 |
choices[0].message.role | string | 常に assistant。 |
choices[0].message.content | string | null | 回答。応答に tool_calls が含まれる場合は null になることがあります。 |
choices[0].message.reasoning_content | string | null | 回答の前のモデルの推論。ない場合は null です。 |
choices[0].message.tool_calls | array | モデルが宣言したツールのいずれかを呼び出す場合にのみ含まれます。 |
choices[0].finish_reason | string | 回答の場合は stop、モデルがツールを呼び出す場合は tool_calls。 |
usage.prompt_tokens | integer | この回答のためにモデルが読み取ったトークン。shannon-2-* と Shannon 3 ファミリーでは、送信したテキストより多くなることがあります。 |
usage.completion_tokens | integer | モデルが書いたトークン。 |
usage.total_tokens | integer | 合計。Shannon モデルの課金額は、この数値から計算されます。 |
-
usageにはトークン数が入っており、金額ではありません。呼び出しで残高から引かれた額は、キーと使用量でリクエストごとに表示されます。計算方法は「上限と残高」にあります。 上限と残高 - エラーやストリームを含むすべての応答に
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のままなので、フレームを確認してください。
呼び出しが失敗した場合
エラーは、type と message を持つ error を含む JSON オブジェクトです。最初の呼び出しで最もよく遭遇する応答を示します。
| ステータス | タイプ | メッセージ | 意味 |
|---|---|---|---|
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、コンテキストウィンドウ、価格。
- Chat Completions — 呼び出したエンドポイントのすべてのリクエストフィールド、応答フィールド、ストリームイベント。
- ストリーミング — ストリームのフレーム、キープアライブ行、ストリーム内のエラー。
- 関数呼び出し — モデルにお使いの関数を呼び出させます。
- 上限と残高 — リクエストが確保するものとそのコスト、送信できるリクエスト数。
- API プレイグラウンド — キーを使って、ブラウザでリクエストを試せます。