- ユーザーとの自然な会話
- 電話の発着信
- 既存のシステムや API との連携
- 予約スケジューリングやカスタマーサポートなど、高度なユースケースを含む複雑なワークフローへの対応
前提条件
作業を始める前に、以下の環境を準備してください。- SambaCloud アカウントと API キー (API キーは SambaCloud ポータルの API Keys タブから生成できます)。
- ダッシュボードにアクセスできる Vapi アカウント。電話番号は不要です。Vapi はダッシュボードから Web 通話を発信できるため、動作するマイクと、マイクにアクセスできるブラウザがあれば十分です。
- Python 3.9 以降。
- ngrok のインストール済み環境と、無料の ngrok アカウント。ステップ 4 で認証トークンを追加するまで ngrok はトンネルを開かないため、アカウントが必要です。
- ターミナル 2 つ。Flask サーバーと ngrok トンネルはどちらもフォアグラウンドで実行され、本ガイドの残りの手順の間、両方を起動したままにしておく必要があります。
macOS には Python 3.9 が同梱されており、
python ではなく python3 として提供されています。バージョンは python3 --version で確認してください。本ガイドで使用する 2 つの依存ライブラリはいずれも requires-python >= 3.9 を宣言しているため、macOS 標準のインタープリターで十分です。モデルの選択
プロキシは受け取ったモデル名をそのまま SambaCloud に転送するため、Vapi に入力する値は正確な SambaCloud のモデル ID でなければなりません。本ガイドの例ではgpt-oss-120b を使用します。
音声用途のモデル選定では、以下の点を考慮してください。
- 会話の 1 ターンが 1 リクエストになります。 発信者が話し終えるたびに、Vapi はトランスクリプト全体をプロキシに送信するため、1 回の通話ではターンごとに 1 リクエストを消費します。無料ティア (Free Tier) のアカウントはモデルごとに 1 日 20 リクエストに制限されており、おおよそ 20 ターンでエージェントが通話の途中で失敗し始めます。支払い方法を登録すると、開発者ティア (Developer Tier) に移行できます。
Meta-Llama-3.3-70B-Instructはリクエスト数の余裕が最も大きいモデルです。 開発者ティアで 240 RPM・48,000 RPD と、他のすべての本番モデルの 4 倍のリクエスト許容量があり、同時通話が見込まれる場合に重要です。- ストリーミングは有効のままにしてください。 プロキシはリクエストで
"stream": trueが設定されている場合にのみストリーミングし、Vapi の音声合成は最初のトークンを受信した時点で始まります。ストリーミングなしでは、応答全体の生成が完了するまで発信者には何も聞こえません。 - 応答は短く保ちます。 音声では、応答が長いほど発信者が聞き続ける時間も長くなります。Vapi が独自の
max_tokensを送信しない場合、app.pyは応答を 250 トークンに制限します。
インストールとセットアップ
以下の手順に従って、リポジトリのクローンと環境の設定を行い、ローカルのプロキシサーバーを介して SambaNova を Vapi に接続します。ステップ 1: リポジトリのクローン
SambaNova の integrations リポジトリをクローンし、Vapi ディレクトリに移動します。ステップ 2: 仮想環境の作成
プロジェクトの依存関係を分離するため、Python の仮想環境を作成して有効化します。ステップ 3: 依存関係のインストール
必要な Python ライブラリをインストールします。ステップ 4: ngrok のインストール
Vapi から到達できるようにローカルサーバーをインターネットに公開するため、ngrok が必要です。 macOS の場合、Homebrew を使用して ngrok をインストールします。ステップ 5: API キーの設定
SambaNova の API キーを環境変数としてエクスポートします。your-sambanova-api-key は、SambaCloud ポータルで取得したキーに置き換えてください。
app.py を開き、ハードコードされたキーを削除します。SambaNova クライアントは環境変数 SAMBANOVA_API_KEY を自動的に読み取るため、他の変更は不要です。
SambaNovaError: The api_key client option must be set either by passing api_key to the client or by setting the SAMBANOVA_API_KEY environment variable を送出します。
ステップ 6: ローカル LLM サーバーの起動
1 つ目のターミナルで Flask サーバーを起動し、そのまま実行し続けます。POST /chat/completions という単一のルートを公開します。ブラウザで http://localhost:5000/ を開くと 404 が返りますが、これは想定どおりの動作です。本ガイドの残りの手順では、このターミナルを常に確認してください。Vapi からのすべてのリクエストが POST /chat/completions のログ行としてここに表示されるため、トラフィックが届いていることを確認する最も速い方法です。
ステップ 7: ngrok によるサーバーの公開
別のターミナルで、次を実行します。ステップ 8: エンドポイントのテスト
cURL リクエストでセットアップを確認します。https://abcd-1234.ngrok-free.dev は、実際の ngrok URL に置き換えてください。"stream": true を設定しているため、サーバーは単一の JSON ボディではなく server-sent events で応答します。app.py は各チャンクをシリアライズし、1 つの data: 行として出力します。
data: 行のストリームが返れば、プロキシは SambaNova に到達しており、Vapi もこれを利用できます。代わりに HTML ページが返る場合は、サーバーでエラーが発生しています。トラブルシューティング をご参照ください。
ステップ 9: カスタム LLM を使った Vapi の設定
- Vapi ダッシュボードにログインします。
- Create Assistant を選択し、空のテンプレートから開始します。
- アシスタントの Model セクションで、プロバイダーを Custom LLM に設定します。
- モデル名を入力します。この値はそのまま SambaCloud に転送されるため、SambaCloud モデルに掲載された正確なモデル ID である必要があります (例:
gpt-oss-120b)。大文字・小文字を含めて完全に一致しない名前は、最初のターンで失敗します。 - エンドポイント URL フィールドに、パスを付けずに ngrok の URL を貼り付けます。
Vapi はこの値を OpenAI クライアントのベース URL として使用し、自身で
/chat/completionsを付加します。これはプロキシサーバーが公開するルートと一致します。ここにパスを含めると/chat/completions/chat/completionsとなり、リクエストは 404 を返します。 - 設定を保存します。
ステップ 10: アシスタントとの会話
Flask サーバーと ngrok トンネルの両方を起動したまま、Vapi ダッシュボードで Talk を選択します。Vapi はブラウザで Web 通話を開始するため、電話番号は不要です。プロンプトが表示されたらマイクへのアクセスを許可し、アシスタントに話しかけてください。 以下の 3 点がすべて確認できれば、連携は正常に動作しています。- 発話するたびに、Flask のターミナルに
200ステータスのPOST /chat/completions行が記録される。 - アシスタントが音声で応答し、その応答が一括で届くのではなく、生成の途中から再生され始める。
- Vapi ダッシュボードに通話が表示され、LLM パイプラインのエラーがない。
トラブルシューティング
command not found: python
command not found: python
macOS には
python 実行ファイルはなく、python3 のみが提供されています。環境の作成には python3 -m venv .venv を使用してください。source .venv/bin/activate で有効化した後は、環境内で python が期待どおりに動作します。AuthenticationError: Error code: 401 - Incorrect API key provided: YOUR_S*****_KEY
AuthenticationError: Error code: 401 - Incorrect API key provided: YOUR_S*****_KEY
app.py がまだプレースホルダのキーを使用しています。このファイルは環境変数を読み取らないため、SAMBANOVA_API_KEY をエクスポートするだけでは効果がありません。ステップ 5 の編集を適用し、サーバーを再起動してください。OSError: [Errno 48] Address already in use
OSError: [Errno 48] Address already in use
別のプロセスがポート 5000 を使用しています。macOS では、デフォルトで有効になっている AirPlay Receiver がポート 5000 を占有していることがよくあります。System Settings → General → AirDrop & Handoff で無効化できます。それ以外の場合は、
app.py の最終行を app.run(port=5001) に変更して空いているポートに移し、ステップ 7 では代わりに ngrok http 5001 を実行してください。Vapi からのエンドポイント呼び出しが 404 になる
Vapi からのエンドポイント呼び出しが 404 になる
Vapi ダッシュボードのエンドポイント URL にパスが含まれています。Vapi は入力された値に
/chat/completions を付加するため、フルパスを入力すると /chat/completions/chat/completions となり、プロキシサーバーはこのルートを提供しません。パスを付けず、ngrok のベース URL のみを入力してください。動作していた Vapi がサーバーに到達しなくなる
動作していた Vapi がサーバーに到達しなくなる
ngrok は再起動のたびに新しい公開 URL を発行し、古い URL は解決できなくなります。Vapi ダッシュボードは警告なしに古い値を保持し続けます。現在の ngrok URL を確認し、アシスタント設定のエンドポイントを更新してください。
エラーではなく対話型デバッガーのページが返される
エラーではなく対話型デバッガーのページが返される
app.py は debug=True で実行されており、未処理の例外が発生すると Werkzeug デバッガーを提供します。公開トンネル経由では、ソースコード・ローカル変数・評価コンソールが露出します。app.py の最終行を app.run(port=5000) に変更すると、通常のエラーページが返されるようになります。最初のターンでモデル名が拒否される
最初のターンでモデル名が拒否される
Vapi の Model セクションの名前はそのまま SambaCloud に渡されるため、正確なモデル ID でない値はすべて拒否されます。大文字・小文字を含めて SambaCloud モデルの値と照合し、モデルの提供終了ページに掲載されていないことを確認してください。ステップ 8 の cURL リクエストにも同じ ID を使用し、両方の経路で同じモデルを検証してください。
通話はつながるがアシスタントが応答しない、または会話の途中で無音になる
通話はつながるがアシスタントが応答しない、または会話の途中で無音になる
お使いのマシンから外側に向かって切り分けます。Flask のターミナルに
POST /chat/completions の行が表示されない場合、Vapi はサーバーに到達していません。トンネルが閉じているか、エンドポイント URL が古くなっているため、ステップ 7 とダッシュボードに保存された URL を再確認してください。行はあるものの 500 が返っている場合、リクエストはサーバーに到達した後、下流で失敗しています。原因の多くは ステップ 5 の API キーか無効なモデル名で、http://127.0.0.1:4040 の ngrok インスペクターに表示されるレスポンスボディで原因を特定できます。リクエストが成功しているのに発信者に何も聞こえない場合は、Vapi ダッシュボードで通話を開き、その終了理由 (ended reason) を確認してください。終了理由は Vapi の call ended reasons(英語)に記載されています。しばらく動作した後にリクエストが失敗し始める
しばらく動作した後にリクエストが失敗し始める
SambaCloud のレート制限に達しています。会話の 1 ターンは 1 リクエストであり、無料ティアのアカウントはモデルごとに 1 日 20 リクエストに制限されています。レスポンスのレート制限ヘッダーと、レート制限ページのティア別の表を確認し、支払い方法を登録して開発者ティアに移行してください。
参考情報
- 詳細な手順と完全なソースコードについては、GitHub の Vapi 連携サンプルをご覧ください。
- Vapi の詳細については、Vapi の公式ドキュメントをご覧ください。
- Vapi ダッシュボードで指定できるモデルについては、SambaCloud モデル をご参照ください。
- モデルごとのリクエスト数とトークン数の制限については、レート制限 をご参照ください。
- プロキシを介さずに SambaNova を直接呼び出す方法については、API リファレンス をご参照ください。

