name: verify-endpoints description: 全AIプロバイダーのAPIエンドポイント(チャット・TTS・STT・Embedding)を動作確認し、レポートを出力する。 allowed-tools: Read, Bash, Grep, Glob, Task, Write user-invocable: true
AIプロバイダー エンドポイント動作確認スキル
全てのAIプロバイダーのエンドポイントに対してテストリクエストを送信し、動作状況をレポートします。
前提条件
- 開発サーバーが
http://localhost:3000で起動していること .envまたは.env.localファイルにAPIキーが設定されていること
実行手順
1. 開発サーバーの確認
まずサーバーが起動しているか確認します:
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/ --max-time 5
200が返れば起動中- それ以外の場合は、ユーザーに
npm run devでサーバーを起動するよう案内して中断
2. 環境変数の確認
.env ファイルを読み込み、設定済みのAPIキーを特定します。以下の環境変数をチェック:
| プロバイダー | 環境変数 |
|---|---|
| OpenAI | OPENAI_API_KEY |
| Anthropic | ANTHROPIC_API_KEY |
GOOGLE_API_KEY |
|
| Azure | AZURE_API_KEY + AZURE_ENDPOINT |
| xAI | XAI_API_KEY |
| Groq | GROQ_API_KEY |
| Cohere | COHERE_API_KEY |
| Mistral AI | MISTRALAI_API_KEY |
| Perplexity | PERPLEXITY_API_KEY |
| Fireworks | FIREWORKS_API_KEY |
| DeepSeek | DEEPSEEK_API_KEY |
| OpenRouter | OPENROUTER_API_KEY |
| Dify | DIFY_API_KEY + DIFY_URL |
| OpenAI TTS | OPENAI_TTS_KEY または OPENAI_API_KEY |
| Azure TTS | AZURE_TTS_KEY + AZURE_TTS_ENDPOINT |
| ElevenLabs | ELEVENLABS_API_KEY |
| Cartesia | CARTESIA_API_KEY |
| Google TTS | GOOGLE_TTS_KEY |
| Koeiromap | NEXT_PUBLIC_KOEIROMAP_KEY |
| Aivis Cloud | AIVIS_CLOUD_API_KEY |
値が空文字列("")のものは「未設定」として扱う。
3. AIチャットエンドポイントのテスト(非ストリーミング)
/api/ai/vercel/ エンドポイントに対して、設定済みの各プロバイダーでテストリクエストを送信します。
注意: Next.jsの trailingSlash: true 設定により、全APIルートでトレイリングスラッシュ (/) が必須。スラッシュなしの場合 308 リダイレクトが返る。本スキル内の全curlコマンドはこれに対応済み。
リクエスト形式
curl -s -w "\n%{http_code}" -X POST http://localhost:3000/api/ai/vercel/ \
-H "Content-Type: application/json" \
-d '{
"messages": [{"role": "user", "content": "Hello, respond with just OK"}],
"aiService": "<SERVICE_NAME>",
"model": "<DEFAULT_MODEL>",
"stream": false,
"temperature": 0.5,
"maxTokens": 50
}' \
--max-time 30
各プロバイダーのデフォルトモデル
| サービス名 | aiService | デフォルトモデル |
|---|---|---|
| OpenAI | openai |
gpt-4.1-mini |
| Anthropic | anthropic |
claude-sonnet-4-5 |
google |
gemini-2.5-flash |
|
| Azure | azure |
※ endpointのdeployment名を使用 |
| xAI | xai |
grok-4 |
| Groq | groq |
llama-3.3-70b-versatile |
| Cohere | cohere |
command-a-03-2025 |
| Mistral AI | mistralai |
mistral-large-latest |
| Perplexity | perplexity |
sonar-pro |
| Fireworks | fireworks |
accounts/fireworks/models/llama-v3p3-70b-instruct |
| DeepSeek | deepseek |
deepseek-chat |
| OpenRouter | openrouter |
openai/gpt-4.1-mini |
判定基準:
- HTTPステータス
200かつレスポンスにテキストが含まれていれば 成功 - HTTPステータス
400でEmptyAPIKey→ APIキー未設定(スキップ扱い) - その他のエラー → 失敗(エラーメッセージを記録)
4. AIチャットエンドポイントのテスト(ストリーミング)
主要プロバイダーについて、ストリーミングモード (stream: true) でも正常にレスポンスが返るか確認します。
ストリーミング固有の問題(イベント形式の不備、reasoning-delta欠落など)を検知する目的。
リクエスト形式
curl -s -N -X POST http://localhost:3000/api/ai/vercel/ \
-H "Content-Type: application/json" \
-d '{
"messages": [{"role": "user", "content": "Say OK"}],
"aiService": "<SERVICE_NAME>",
"model": "<DEFAULT_MODEL>",
"stream": true,
"temperature": 0.5,
"maxTokens": 50
}' \
--max-time 30
対象プロバイダー: openai, anthropic, google(主要3社のみ)
判定基準:
- レスポンスに
"type":"text-delta"が1つ以上含まれていれば 成功 - 空レスポンスまたはエラーJSON → 失敗
5. Reasoningストリーミングテスト
推論(reasoning/thinking)モードが正常に動作し、reasoning-delta イベントがストリーミングされることを確認します。
5.1 OpenAI Reasoning(o4-mini)
条件:OPENAI_API_KEY が設定済み
curl -s -N -X POST http://localhost:3000/api/ai/vercel/ \
-H "Content-Type: application/json" \
-d '{
"messages": [{"role": "user", "content": "What is 15 multiplied by 17? Think carefully."}],
"aiService": "openai",
"model": "o4-mini",
"stream": true,
"reasoningMode": true,
"reasoningEffort": "medium",
"temperature": 1.0,
"maxTokens": 512
}' \
--max-time 30
判定基準:
- ストリームに
"type":"reasoning-delta"が1つ以上含まれていれば 成功 reasoning-start→reasoning-endのみでreasoning-deltaがない → 失敗(providerOptionsにreasoningSummaryが設定されていない可能性)- エラーレスポンス → 失敗
5.2 Anthropic Thinking(claude-3-7-sonnet-latest)
条件:ANTHROPIC_API_KEY が設定済み
curl -s -N -X POST http://localhost:3000/api/ai/vercel/ \
-H "Content-Type: application/json" \
-d '{
"messages": [{"role": "user", "content": "What is 15 multiplied by 17?"}],
"aiService": "anthropic",
"model": "claude-3-7-sonnet-latest",
"stream": true,
"reasoningMode": true,
"reasoningTokenBudget": 4096,
"temperature": 1.0,
"maxTokens": 512
}' \
--max-time 30
判定基準:
- ストリームに
"type":"reasoning-delta"が1つ以上含まれていれば 成功 reasoning-deltaがない → 失敗- エラーレスポンス → 失敗
5.3 Google Thinking(gemini-2.5-flash)
条件:GOOGLE_API_KEY が設定済み
curl -s -N -X POST http://localhost:3000/api/ai/vercel/ \
-H "Content-Type: application/json" \
-d '{
"messages": [{"role": "user", "content": "What is 15 multiplied by 17?"}],
"aiService": "google",
"model": "gemini-2.5-flash",
"stream": true,
"reasoningMode": true,
"reasoningTokenBudget": 4096,
"temperature": 1.0,
"maxTokens": 512
}' \
--max-time 30
判定基準:
- ストリームに
"type":"reasoning-delta"が1つ以上含まれていれば 成功 reasoning-deltaがない → 失敗- エラーレスポンス → 失敗
6. Difyエンドポイントのテスト
DIFY_API_KEY と DIFY_URL の両方が設定されている場合のみ実行:
curl -s -w "\n%{http_code}" -X POST http://localhost:3000/api/difyChat/ \
-H "Content-Type: application/json" \
-d '{
"query": "Hello, respond with just OK",
"stream": false,
"conversationId": ""
}' \
--max-time 30
7. カスタムAPIエンドポイントのテスト
/api/ai/custom エンドポイントは外部APIのURLが必要なため、自動テストはスキップする。
レポートには「外部URL未指定のためスキップ」と記載する。
8. TTSエンドポイントのテスト
各TTSエンドポイントにテストリクエストを送信します。短いテキスト「テスト」を使用。
8.1 OpenAI TTS (/api/openAITTS)
条件:OPENAI_TTS_KEY または OPENAI_API_KEY が設定済み
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3000/api/openAITTS/ \
-H "Content-Type: application/json" \
-d '{
"message": "テスト",
"voice": "shimmer",
"model": "tts-1",
"speed": 1.0
}' \
--max-time 30
成功: ステータス 200
8.2 Azure OpenAI TTS (/api/azureOpenAITTS)
条件:AZURE_TTS_KEY と AZURE_TTS_ENDPOINT が設定済み
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3000/api/azureOpenAITTS/ \
-H "Content-Type: application/json" \
-d '{
"message": "テスト",
"voice": "alloy",
"speed": 1.0
}' \
--max-time 30
8.3 ElevenLabs (/api/elevenLabs)
条件:ELEVENLABS_API_KEY が設定済み
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3000/api/elevenLabs/ \
-H "Content-Type: application/json" \
-d '{
"message": "test"
}' \
--max-time 30
8.4 Google TTS (/api/tts-google)
条件:GOOGLE_TTS_KEY が設定済み
curl -s -w "\n%{http_code}" -X POST http://localhost:3000/api/tts-google/ \
-H "Content-Type: application/json" \
-d '{
"message": "テスト",
"ttsType": "ja-JP-Wavenet-A",
"languageCode": "ja-JP"
}' \
--max-time 30
8.5 Cartesia (/api/cartesia)
条件:CARTESIA_API_KEY が設定済み
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3000/api/cartesia/ \
-H "Content-Type: application/json" \
-d '{
"message": "test",
"language": "en"
}' \
--max-time 30
8.6 Koeiromap (/api/tts-koeiromap)
条件:NEXT_PUBLIC_KOEIROMAP_KEY が設定済み
curl -s -w "\n%{http_code}" -X POST http://localhost:3000/api/tts-koeiromap/ \
-H "Content-Type: application/json" \
-d '{
"message": "テスト",
"speakerX": 0,
"speakerY": 0,
"style": "talk",
"apiKey": ""
}' \
--max-time 30
※ apiKey は .env から取得した NEXT_PUBLIC_KOEIROMAP_KEY の値を使う
8.7 Aivis Cloud API (/api/tts-aivis-cloud-api)
条件:AIVIS_CLOUD_API_KEY と NEXT_PUBLIC_AIVIS_CLOUD_MODEL_UUID が設定済み
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3000/api/tts-aivis-cloud-api/ \
-H "Content-Type: application/json" \
-d '{
"text": "テスト",
"modelUuid": "<MODEL_UUID>",
"speed": 1.0
}' \
--max-time 30
8.8 VOICEVOX (/api/tts-voicevox) - ローカルサービス
条件:VOICEVOXエンジンが起動しているか確認(デフォルト localhost:50021)
# まずローカルサーバーの稼働確認
curl -s -o /dev/null -w "%{http_code}" http://localhost:50021/version --max-time 5
起動中の場合のみテスト:
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3000/api/tts-voicevox/ \
-H "Content-Type: application/json" \
-d '{
"text": "テスト",
"speaker": 46,
"speed": 1.0,
"pitch": 0,
"intonation": 1.0
}' \
--max-time 30
※ speaker は .env の NEXT_PUBLIC_VOICEVOX_SPEAKER の値を使用。pitch と intonation は必須パラメータ(未指定だと500エラー)。
8.9 AivisSpeech (/api/tts-aivisspeech) - ローカルサービス
条件:AivisSpeechエンジンが起動しているか確認(デフォルト localhost:10101)
# まずローカルサーバーの稼働確認
curl -s -o /dev/null -w "%{http_code}" http://localhost:10101/version --max-time 5
起動中の場合のみテスト:
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3000/api/tts-aivisspeech/ \
-H "Content-Type: application/json" \
-d '{
"text": "テスト",
"speaker": 633572448,
"speed": 1.0,
"pitch": 0,
"intonationScale": 1.0
}' \
--max-time 30
※ speaker は .env の NEXT_PUBLIC_AIVIS_SPEECH_SPEAKER の値を使用。pitch と intonationScale は必須パラメータ(未指定だと500エラー)。VOICEVOXでは intonation、AivisSpeechでは intonationScale とパラメータ名が異なる点に注意。
8.10 Style-Bert-VITS2 (/api/stylebertvits2)
条件:STYLEBERTVITS2_SERVER_URL が設定済み(ローカルの場合はサーバー稼働確認も行う)
curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:3000/api/stylebertvits2/ \
-H "Content-Type: application/json" \
-d '{
"message": "テスト",
"stylebertvits2ModelId": "0",
"stylebertvits2Style": "Neutral",
"stylebertvits2SdpRatio": "0.2",
"stylebertvits2Length": "1.0",
"selectLanguage": "ja"
}' \
--max-time 30
注意: GSVI TTSはクライアントサイドから直接外部サーバーを呼び出す方式のため、Next.js APIルートが存在しない。テスト対象外。
9. Embeddingエンドポイントのテスト (/api/embedding)
条件:OPENAI_API_KEY が設定済み
curl -s -w "\n%{http_code}" -X POST http://localhost:3000/api/embedding/ \
-H "Content-Type: application/json" \
-d '{
"text": "テスト"
}' \
--max-time 30
10. ローカルLLMサービスの確認
10.1 Ollama
curl -s -o /dev/null -w "%{http_code}" http://localhost:11434/api/tags --max-time 5
10.2 LM Studio
curl -s -o /dev/null -w "%{http_code}" http://localhost:1234/v1/models --max-time 5
稼働している場合は利用可能なモデル一覧も取得して表示する。
11. レポート出力
全テスト完了後、reports/endpoints/ ディレクトリにMarkdownレポートを出力します。
ファイル名: reports/endpoints/verify-YYYY-MM-DD-HHmmss.md
レポート形式
# AIプロバイダー エンドポイント動作確認レポート
実行日時: YYYY-MM-DD HH:mm:ss
## サマリー
| カテゴリ | 成功 | 失敗 | スキップ | 合計 |
| ------------------ | ----- | ----- | -------- | ----- |
| AIチャット(batch) | X | X | X | X |
| AIチャット(stream) | X | X | X | X |
| Reasoning | X | X | X | X |
| TTS | X | X | X | X |
| その他 | X | X | X | X |
| **合計** | **X** | **X** | **X** | **X** |
## AIチャットエンドポイント(非ストリーミング)
| プロバイダー | モデル | ステータス | 詳細 |
| ------------ | ----------------- | ----------- | ------------- |
| OpenAI | gpt-4.1-mini | ✅ 成功 | 200 OK |
| Anthropic | claude-sonnet-4-5 | ✅ 成功 | 200 OK |
| Google | gemini-2.5-flash | ❌ 失敗 | 403 Forbidden |
| Azure | - | ⏭️ スキップ | APIキー未設定 |
| ... | ... | ... | ... |
## AIチャットエンドポイント(ストリーミング)
| プロバイダー | モデル | ステータス | 詳細 |
| ------------ | ----------------- | ---------- | ----------------------- |
| OpenAI | gpt-4.1-mini | ✅ 成功 | text-delta イベント確認 |
| Anthropic | claude-sonnet-4-5 | ✅ 成功 | text-delta イベント確認 |
| Google | gemini-2.5-flash | ❌ 失敗 | ストリームが空 |
| ... | ... | ... | ... |
## Reasoningストリーミング
| プロバイダー | モデル | ステータス | reasoning-delta数 | 詳細 |
| ------------ | ------------------------ | ---------- | ----------------- | ----------------------- |
| OpenAI | o4-mini | ✅ 成功 | 45 | reasoning-delta確認済み |
| Anthropic | claude-3-7-sonnet-latest | ✅ 成功 | 12 | reasoning-delta確認済み |
| Google | gemini-2.5-flash | ❌ 失敗 | 0 | reasoning-delta未検出 |
| ... | ... | ... | ... | ... |
## TTSエンドポイント
| プロバイダー | エンドポイント | ステータス | 詳細 |
| ------------ | ----------------- | ----------- | ---------------------- |
| OpenAI TTS | /api/openAITTS | ✅ 成功 | 200 OK |
| VOICEVOX | /api/tts-voicevox | ✅ 成功 | ローカルサーバー稼働中 |
| ElevenLabs | /api/elevenLabs | ⏭️ スキップ | APIキー未設定 |
| ... | ... | ... | ... |
## ローカルサービス
| サービス | URL | ステータス | 詳細 |
| ----------- | --------------- | ---------- | ------------- |
| VOICEVOX | localhost:50021 | ✅ 稼働中 | version X.X.X |
| AivisSpeech | localhost:10101 | ❌ 停止中 | 接続不可 |
| Ollama | localhost:11434 | ✅ 稼働中 | N個のモデル |
| LM Studio | localhost:1234 | ❌ 停止中 | 接続不可 |
## その他
| エンドポイント | ステータス | 詳細 |
| -------------- | ----------- | --------------------------- |
| Embedding | ✅ 成功 | 200 OK |
| Custom API | ⏭️ スキップ | 外部URL未指定のためスキップ |
## エラー詳細
(失敗したテストの詳細なエラーメッセージをここに記載)
実行上の注意
- APIコストに注意: 各プロバイダーへのリクエストで少額のAPI利用料が発生する可能性がある(Reasoningテストは推論トークンを消費するため通常より高コスト)
- タイムアウト: 各リクエストは30秒のタイムアウトを設定
- テストデータ: 最小限のリクエスト(「テスト」「OK」等の短文)を使用してコストを最小化
- 並列実行禁止: APIのレートリミットを避けるため、テストは順次実行する
- ローカルサービス: まずポートの疎通確認を行い、応答がない場合は即座にスキップ
- トレイリングスラッシュ: Next.jsの
trailingSlash: true設定により、全APIルートでトレイリングスラッシュ必須(なしだと308リダイレクト) - GSVI TTS: クライアントサイド直接呼び出し方式のため、APIルートが存在しない。テスト対象外
- Custom API: 外部URLの指定が必要なため、自動テストはスキップ。レポートにはスキップとして記載
テスト対象外のAPIルート
以下のエンドポイントはAIプロバイダーの動作確認の範囲外のため、このスキルではテストしない:
/api/ai/custom- カスタムAPI(外部URL必須のためスキップ)/api/whisper- 音声認識(音声ファイル入力が必要)/api/messages- メッセージ処理/api/get-vrm-list,/api/get-live2d-list,/api/get-pngtuber-list- モデル一覧取得/api/get-background-list,/api/get-image-list- アセット一覧取得/api/upload-image,/api/delete-image,/api/upload-vrm-list,/api/upload-background- アセット管理/api/update-voicevox-speakers,/api/update-aivis-speakers- スピーカー情報更新/api/getSlideFolders,/api/updateSlideData,/api/convertSlide- スライド機能/api/getSupplement,/api/convertMarkdown- コンテンツ変換/api/memory-files,/api/memory-restore- メモリ管理/api/save-chat-log- チャットログ保存/api/youtube/continuation- YouTube連携
引数
$ARGUMENTS を使って動作を制御できます:
chat- AIチャットエンドポイントのみテスト(batch + stream)tts- TTSエンドポイントのみテストreasoning- Reasoningストリーミングテストのみlocal- ローカルサービスの確認のみ<provider名>- 特定のプロバイダーのみテスト(例:openai,voicevox)- 引数なし - 全エンドポイントをテスト