コンテンツへスキップ
クイックスタート

クイックスタート

最初のリクエストを送信します:キーを取得し、メッセージをひとつ送信して、応答を読みます。この 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)
フィールド 型 デフォルト 説明
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 オブジェクトを返します。以下のテキストと数値は例です。

200 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)

ストリームの各フレームは、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 プレイグラウンド — キーを使って、ブラウザでリクエストを試せます。