each-sense について
each::senseは、クリエイター向けの生成メディアAIエージェントです。単一のインターフェースで画像、動画、音声、3Dコンテンツを生成でき、ウェブ検索や会話の記憶、複数段階のワークフローにも対応します。
主な機能
- 01画像、動画、音声、3Dコンテンツの生成
- 02単一インターフェースで複数のAIモデルを調整
- 03複数段階のワークフロー構築
- 04セッション記憶による反復作業
- 05実行計画の提示や確認質問
活用シーン
- 01マーケティング素材や広告クリエイティブの制作
- 02EC向け商品画像の生成
- 03ソーシャルメディア動画の制作
- 04複数モデルを組み合わせた創作ワークフロー
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ eachlabs/ skills --skill each-senseインストール後、Claude Code で/each-senseを入力して読み込まれたか確認します。
同梱ファイルreferences/SSE-EVENTS.md
詳細
each::sense - 生成メディアのインテリジェントレイヤー
each::sense は、画像、動画、音声、3D モデルの生成、ワークフローの構築、ウェブ検索、会話形式のやり取りが可能な OpenAI 互換の AI エージェントです。単一の統合インターフェースを通じて、500 以上の AI モデルをオーケストレーションします。
each::sense 自体は完全無料です。料金が発生するのは、使用するモデルに対してのみです。
ユーザーが次のものを必要としている場合に、each::sense をお使いください:
- マーケティング素材や広告クリエイティブ
- 商品画像や E コマース向けビジュアル
- 動画コンテンツ(広告、UGC、ソーシャルメディア)
- 音声や音楽の生成
- あらゆるクリエイティブコンテンツの生成
- 複数の AI モデルを組み合わせたマルチステップのワークフロー
認証
Header: X-API-Key: <your-api-key>
OpenAI SDK 互換の認証にも対応しています:
Header: Authorization: Bearer <your-api-key>
API キーは eachlabs.ai で取得してください。
EACHLABS_API_KEY 環境変数を設定してください。
ベース URL
https://eachsense-agent.core.eachlabs.run
エンドポイント
| メソッド | パス | 用途 |
|---|---|---|
| POST | /v1/chat/completions | メインのチャットエンドポイント |
| POST | /workflow | ワークフロービルダー |
| GET | /v1/models | 利用可能なモデルの一覧 |
| GET | /memory?session_id={id} | セッションメモリの取得 |
| DELETE | /memory?session_id={id} | セッションメモリの消去 |
| GET | /sessions | すべてのセッションの一覧 |
クイックスタート
curl を使用する場合
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Generate a portrait of a woman with golden hour lighting"}],
"model": "eachsense/beta",
"stream": true,
"mode": "max"
}'
Python(OpenAI SDK)を使用する場合
from openai import OpenAI
client = OpenAI(
api_key="YOUR_EACHLABS_API_KEY",
base_url="https://eachsense-agent.core.eachlabs.run/v1"
)
# Non-streaming
response = client.chat.completions.create(
model="eachsense/beta",
messages=[{"role": "user", "content": "Generate a sunset landscape"}],
stream=False
)
print(response.generations) # List of media URLs
# Streaming
stream = client.chat.completions.create(
model="eachsense/beta",
messages=[{"role": "user", "content": "Generate a sunset landscape"}],
stream=True
)
for chunk in stream:
eachlabs_data = chunk.model_extra.get("eachlabs")
if eachlabs_data:
event_type = eachlabs_data.get("type")
if event_type == "generation_response":
print(eachlabs_data["generations"])
JavaScript(OpenAI SDK)を使用する場合
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_EACHLABS_API_KEY",
baseURL: "https://eachsense-agent.core.eachlabs.run/v1"
});
// Non-streaming
const response = await client.chat.completions.create({
model: "eachsense/beta",
messages: [{ role: "user", content: "Generate a sunset landscape" }],
stream: false
});
console.log(response.generations);
// Streaming
const stream = await client.chat.completions.create({
model: "eachsense/beta",
messages: [{ role: "user", content: "Generate a sunset landscape" }],
stream: true
});
for await (const chunk of stream) {
const eachlabs = chunk.eachlabs;
if (eachlabs?.type === "generation_response") {
console.log(eachlabs.generations);
}
}
リクエストスキーマ
{
"messages": [{"role": "user", "content": "string (required) - User's request"}],
"model": "string (optional, default: 'eachsense/beta')",
"stream": "boolean (optional, default: true) - Enable SSE streaming",
"session_id": "string (optional) - Session ID for conversation history and multi-turn chats",
"mode": "string (optional, default: 'max') - Quality mode: 'max' or 'eco'",
"behavior": "string (optional, default: 'agent') - Behavior: 'agent', 'plan', or 'ask'",
"image_urls": "array[string] (optional) - Image URLs for editing/processing (max 4)",
"workflow_id": "string (optional) - Execute specific workflow",
"version_id": "string (optional) - Workflow version",
"web_search": "boolean (optional, default: true) - Enable/disable web search",
"enable_safety_checker": "boolean (optional, default: true) - Set to false to allow NSFW content generation"
}
パラメーターの詳細
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
messages | array | required | role と content を含むチャットメッセージ |
model | string | "eachsense/beta" | モデル識別子 |
stream | boolean | true | SSE ストリーミングを有効にします |
session_id | string | null | 会話履歴用のセッション ID。以前のチャットの続行、追加説明への対応、出力の反復的な調整に使用します |
mode | string | "max" | max = 最高品質(プレミアムモデル)、eco = 最速/最安 |
behavior | string | "agent" | agent = 自動実行、plan = 最初にプランを表示、ask = 最初に確認 |
image_urls | array | null | 処理/編集する画像の URL(最大 4 件) |
workflow_id | string | null | 特定のワークフローを実行します |
version_id | string | null | ワークフローのバージョン。workflow_id と併用します |
web_search | boolean | true | 情報のウェブ検索を許可します |
enable_safety_checker | boolean | true | false に設定すると、NSFW コンテンツの生成が許可されます |
OpenAI SDK の追加パラメーター: OpenAI SDK を使用する場合は、標準以外のパラメーターを extra_body 経由で渡します:
response = client.chat.completions.create(
model="eachsense/beta",
messages=[{"role": "user", "content": "Generate a quick sketch"}],
extra_body={"mode": "eco", "session_id": "my-session"},
stream=False
)
非ストリーミングレスポンス
{
"id": "chatcmpl-123",
"object": "chat.completion",
"choices": [{"message": {"role": "assistant", "content": "Here's your image..."}}],
"generations": ["https://cdn.example.com/image.png"],
"task_id": "task-456",
"session_id": "my-session"
}
モード
MAX モード(デフォルト)
プレミアム品質のモデル(flux-2-max、veo-3 など)を使用します。最終出力、クライアント向けの作業、品質を最優先する場合に最適です。処理時間:10~300 秒。
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Create a product shot"}],
"model": "eachsense/beta",
"stream": true,
"mode": "max"
}'
ECO モード
高速で費用対効果の高いモデル(flux-2-pro、veo3-1-fast など)を使用します。プロトタイピング、ドラフト、大量生成に最適です。処理時間:5~180 秒。
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Create a product shot"}],
"model": "eachsense/beta",
"stream": true,
"mode": "eco"
}'
動作モード
Agent(デフォルト)
リクエストを自動的に実行し、最適なモデルを選択して、すぐに出力を生成します。
{
"messages": [{"role": "user", "content": "Generate a sunset video"}],
"model": "eachsense/beta",
"behavior": "agent"
}
Plan
実行前に、所要時間とコストの見積もりを含む実行プランを表示します。アプローチを確認したい複雑なリクエストに適しています。
{
"messages": [{"role": "user", "content": "Create a marketing video for my bakery"}],
"model": "eachsense/beta",
"behavior": "plan"
}
Ask
処理を進める前に、必ず確認の質問をします。最大限に制御したい場合に適しています。
{
"messages": [{"role": "user", "content": "Generate a portrait"}],
"model": "eachsense/beta",
"behavior": "ask"
}
セッション管理
session_id を使用すると、複数のリクエストにわたって会話履歴とコンテキストを保持できます。これにより、次のことが可能になります:
- 複数ターンの会話:コンテキストを繰り返さずに、以前のリクエストへの追加依頼ができます
- 反復的な調整:以前に生成したコンテンツの変更を依頼できます
- 確認のやり取り:
clarification_neededイベントに応答し、会話を続けられます - コンテキストの把握:AI が以前の生成内容、設定、指示を記憶します
セッション制限
| 指標 | 制限 |
|---|---|
| アイドルタイムアウト | 15 minutes |
| セッション TTL | 30 days |
| セッションあたりのメッセージ数 | 50 |
セッションは、API キーと session_id の組み合わせごとに管理されます。異なる API キーから他のキーのセッションにアクセスすることはできません。
セッション管理エンドポイント
# Retrieve session memory
curl https://eachsense-agent.core.eachlabs.run/memory?session_id=my-session \
-H "X-API-Key: $EACHLABS_API_KEY"
# Clear session memory
curl -X DELETE https://eachsense-agent.core.eachlabs.run/memory?session_id=my-session \
-H "X-API-Key: $EACHLABS_API_KEY"
# List all sessions
curl https://eachsense-agent.core.eachlabs.run/sessions \
-H "X-API-Key: $EACHLABS_API_KEY"
例:反復生成
# First request - generate initial image
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Generate a logo for a coffee shop called Brew Lab"}],
"model": "eachsense/beta",
"stream": true,
"session_id": "logo-project-001"
}'
# Follow-up - modify the result (same session_id)
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Make it more minimalist and change the color to dark green"}],
"model": "eachsense/beta",
"stream": true,
"session_id": "logo-project-001"
}'
# Another follow-up - request variation (same session_id)
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Create 3 variations of this logo"}],
"model": "eachsense/beta",
"stream": true,
"session_id": "logo-project-001"
}'
例:追加確認への対応
# Ambiguous request - AI will ask for clarification
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Edit this image"}],
"model": "eachsense/beta",
"stream": true,
"session_id": "edit-task-001",
"image_urls": ["https://example.com/photo.jpg"]
}'
# Response: clarification_needed event asking what edit to make
# Respond to clarification (same session_id)
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Remove the background and make it transparent"}],
"model": "eachsense/beta",
"stream": true,
"session_id": "edit-task-001",
"image_urls": ["https://example.com/photo.jpg"]
}'
ユースケースの例
1. 画像生成
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Generate a professional headshot of a business executive, studio lighting"}],
"model": "eachsense/beta",
"stream": true,
"mode": "max"
}'
2. 動画生成
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Create a 5 second video of a sunset over the ocean"}],
"model": "eachsense/beta",
"stream": true,
"mode": "max"
}'
3. 画像編集(アップロードした画像を使用)
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Remove the background from this image"}],
"model": "eachsense/beta",
"stream": true,
"image_urls": ["https://example.com/my-photo.jpg"]
}'
4. 画像から動画へのアニメーション化
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Animate this image with gentle camera movement"}],
"model": "eachsense/beta",
"stream": true,
"image_urls": ["https://example.com/landscape.jpg"]
}'
5. 商品写真
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Generate a product shot of a coffee mug on a wooden table with morning light"}],
"model": "eachsense/beta",
"stream": true,
"mode": "max"
}'
6. マーケティング素材
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Create a social media ad for a fitness app, show someone working out with energetic vibes"}],
"model": "eachsense/beta",
"stream": true,
"mode": "max"
}'
7. 複雑なワークフロー(UGC 動画)
curl -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Create a 30 second UGC video with a consistent presenter explaining why fitness is important. The presenter is a 30-year-old fit woman with brown hair in workout clothes, gym background."}],
"model": "eachsense/beta",
"stream": true,
"mode": "max"
}'
8. ワークフロービルダー
curl -X POST https://eachsense-agent.core.eachlabs.run/workflow \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-d '{
"message": "Create a workflow that generates an image and then upscales it",
"stream": true,
"session_id": "my-session"
}'
SSE レスポンス形式
エンドポイントは、OpenAI chat.completion.chunk 形式と eachlabs 拡張フィールドでラップされた Server-Sent Events(SSE)を返します。
各イベントの形式は次のとおりです。
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","choices":[{"delta":{"content":""}}],"eachlabs":{"type":"event_type",...}}\n\n
ストリームは次の形式で終了します。
data: [DONE]\n\n
イベントタイプ(全 18 種類)
AI の推論:
| イベント | 説明 |
|---|---|
thinking_delta | リアルタイムの AI 推論 |
text_response | テキストコンテンツ(説明、回答) |
ツール操作:
| イベント | 説明 |
|---|---|
status | 実行中の操作(tool_name、parameters を含む) |
tool_call | 呼び出されるツールの詳細 |
message | 情報メッセージ |
progress | percent を含む進捗状況の更新 |
生成:
| イベント | 説明 |
|---|---|
generation_response | 生成されたメディアの URL(url、generations[]、model、execution_time_ms) |
対話:
| イベント | 説明 |
|---|---|
clarification_needed | AI が追加情報を必要としている状態(question、options[]、context) |
ウェブ検索:
| イベント | 説明 |
|---|---|
web_search_query | 実行中のウェブ検索 |
web_search_citations | title、url、snippet を含む引用 |
ワークフロー:
| イベント | 説明 |
|---|---|
workflow_created | 新しいワークフローが作成されました |
workflow_fetched | 既存のワークフローが読み込まれました |
workflow_built | ワークフロー定義が構築されました |
workflow_updated | ワークフローが API に送信されました |
実行:
| イベント | 説明 |
|---|---|
execution_started | ワークフローの実行が開始されました |
execution_progress | ステップの進捗(step_id、completed_steps、total_steps) |
execution_completed | ワークフローが完了しました(output、all_outputs、total_time_ms) |
終了:
| イベント | 説明 |
|---|---|
complete | タスクが完了しました(status:ok/error/clarification_needed、generations[]) |
error | エラーが発生しました(message、error_code) |
一般的なイベントの流れ
thinking_delta → status → status → text_response → generation_response → complete → [DONE]
主なイベントの例
generation_response
{
"type": "generation_response",
"url": "https://storage.eachlabs.ai/outputs/abc123.png",
"generations": ["https://storage.eachlabs.ai/outputs/abc123.png"],
"model": "flux-2-max",
"execution_time_ms": 8500
}
clarification_needed
{
"type": "clarification_needed",
"question": "What type of edit would you like to make to this image?",
"options": ["Remove the background", "Apply a style transfer", "Upscale to higher resolution"],
"context": "I can see your image but need to know the specific edit you want."
}
complete
{
"type": "complete",
"task_id": "chat_1708345678901",
"status": "ok",
"generations": ["https://storage.eachlabs.ai/outputs/abc123.png"],
"model": "flux-2-max"
}
エージェントツール
| ツール | 種類 | 用途 |
|---|---|---|
search_models | 非終端 | ユースケースに合ったモデルを検索 |
get_model_details | 非終端 | モデルの入力スキーマを取得 |
web_search | 非終端 | ウェブ検索 |
vision_preprocessor | 非終端 | 画像コンテンツを分析 |
execute_model | 終端 | モデルの予測を実行 |
generate_text | 終端 | テキストレスポンスを生成 |
create_workflow | 非終端 | ワークフローを作成 |
trigger_workflow | 非終端 | ワークフローを実行 |
build_workflow | 非終端 | ワークフロー定義を構築 |
check_execution | 非終端 | 実行状況を確認 |
ask_clarification | 終端 | 追加確認を求める |
モデル早見表
| 用途 | モデルスラッグ | 速度 |
|---|---|---|
| 最高画質の画像 | flux-2-max | 中 |
| 高速な画像生成 | flux-2-pro | 高速 |
| 画像内のテキスト/ロゴ | flux-kontext-pro | 高速 |
| 迅速なプロトタイピング | nano-banana-pro | 非常に高速 |
| 写実的な画像 | gemini-imagen-4 | 中 |
| 芸術的/創造的な画像 | seedream-v4-5 | 中 |
| 最高品質の動画(音声付き) | veo-3 | 低速 |
| 高速な動画生成 | veo3-1-fast | 高速 |
| 高品質な動画 | kling-3-0 | 中 |
| 画像から動画への変換 | kling-2-1-image-to-video | 中 |
| 指示に基づく編集 | flux-2-edit | 高速 |
| 背景の削除 | eachlabs-bg-remover-v1 | 非常に高速 |
| 画像のアップスケーリング | topaz-upscale-image | 高速 |
| 顔の入れ替え | kling-face-swap | 高速 |
| テキスト読み上げ | elevenlabs-tts | 非常に高速 |
| 音楽生成 | mureka-generate-music | 中 |
モデルの別名
自動的に解決される、一般的な略称です。
| 別名 | 解決先 |
|---|---|
| Flux Max | flux-2-max |
| Flux Pro | flux-2-pro |
| Flux Edit | flux-2-edit |
| Flux Fill | flux-fill-pro |
| Flux Kontext | flux-kontext-pro |
| Imagen 4 | gemini-imagen-4 |
| Veo 3 | veo-3 |
| Kling 3 | kling-3-0 |
| Sora | sora-2-pro |
| ElevenLabs | elevenlabs-tts |
エラー処理
HTTP エラー
| コード | 応答 | 原因 |
|---|---|---|
| 401 | {"error": "Invalid or missing API key"} | API キーがないか、無効です |
| 422 | {"error": "..."} | 必須フィールドがないか、パラメーターが無効です |
| 429 | {"error": "..."} | レート制限に達しました。指数バックオフを実装してください |
| 500 | {"error": "..."} | 内部サーバーエラーです。バックオフして再試行してください |
ストリーミングエラー
{"type": "error", "message": "Failed to execute model: Invalid parameters", "error_code": "..."}
| エラーメッセージ | 原因 | 解決策 |
|---|---|---|
Model execution failed | 基盤モデルのエラー | モデルのパラメーターを確認してください |
Session not found | セッションが無効か、期限切れです | 新しいセッションを作成してください |
Workflow execution timeout | 15 分の制限を超過しました | 小さなワークフローに分割してください |
再試行戦略: 429 および 500 エラーには指数バックオフを使用します。2^attempt 秒待機し、最大 3 回まで再試行してください。
タイムアウト
クライアントのタイムアウト推奨値: HTTP クライアントのタイムアウトは最低 10 分に設定してください。複雑なユースケースでは、複数の AI モデルを順番に実行する必要がある場合があります(例:UGC 動画では 10 回以上のモデル実行)。
| 操作 | タイムアウト |
|---|---|
| HTTP リクエスト | 300 秒 |
| ストリーミングのアイドル時間 | 15 分 |
| 画像生成 | 10~60 秒 |
| 動画生成 | 60~600 秒 |
| ワークフロー実行 | 15 分 |
# curl example with 10 minute timeout
curl --max-time 600 -X POST https://eachsense-agent.core.eachlabs.run/v1/chat/completions \
-H "Content-Type: application/json" \
-H "X-API-Key: $EACHLABS_API_KEY" \
-H "Accept: text/event-stream" \
-d '{
"messages": [{"role": "user", "content": "Create a complex UGC video..."}],
"model": "eachsense/beta",
"stream": true
}'
レート制限
| プラン | リクエスト/分 | 同時実行数 |
|---|---|---|
| Free | 10 | 2 |
| Pro | 60 | 10 |
| Enterprise | 300 | 50 |
レート制限ヘッダー:X-RateLimit-Limit、X-RateLimit-Remaining、X-RateLimit-Reset
入力検証の制限
| 入力タイプ | 制約 |
|---|---|
| 1 リクエストあたりの画像数 | 最大 4 枚 |
| 画像形式 | JPEG、PNG、WebP、GIF |
| 画像サイズ | 最大 20MB、64~8192px |
| 動画形式 | MP4、WebM、MOV |
| 動画サイズ | 最大 500MB、10 分 |
| 音声形式 | MP3、WAV、M4A、OGG |
| 音声サイズ | 最大 50MB、5 分 |
| プロンプトの長さ | 最大 10,000 文字 |
| セッションメモリ | 最大 50 メッセージ |
ベストプラクティス
- コンテキストを維持するため、複数ターンの会話には session_id を使用します
- プロトタイピングやコスト重視のアプリケーションには ECO モード を使用します
- 確認イベントを処理します。同じセッション内で、要求された情報を返してください
- 明確なプロンプトを入力します。スタイル、雰囲気、構図を具体的に指定してください
- SSE イベントを監視します。進捗には
thinking_delta、出力にはgeneration_responseを使用します - より簡単に統合するには OpenAI SDK を使用します。each::sense のベース URL を指定するだけです
- 再試行ロジックを実装します。一時的なエラーには指数バックオフを使用してください