Skip to main content
本ガイドでは、セットアップから実践的なユースケースまで、LangGraph と SambaNova を連携させる手順を解説します。LangGraph は、ステートフルで長時間実行されるワークフローやエージェントを構築するための低レベルの基盤フレームワークです。

前提条件

作業を始める前に、以下の環境を準備してください。
  • 有効な API キーを取得済みの SambaCloud アカウント
  • Python 3.10 以上がインストールされていること。langgraph と langchain-sambanova は Python 3.9 以前をサポートしていません。
  • グラフからツールを呼び出す場合は、Function calling (関数呼び出し) に対応したモデル。本ページの例では、Function calling に対応した Meta-Llama-3.3-70B-Instruct を使用します。対応モデルの一覧は Function calling と JSON モード をご参照ください。Function calling 非対応のモデルでツール呼び出しグラフを実行すると、モデルはツール呼び出しを一切発行しないため、グラフは通常のテキスト応答を返し、ツールノードは完全にスキップされます。
macOS には Python 3.9 が標準搭載されており、python ではなく python3 として提供されます。python3 --version でバージョンを確認してください。3.10 未満の場合は、pyenv、uv、または brew install python@3.12 で対応バージョンをインストールしてから先へ進んでください。

インストールとセットアップ

  1. 仮想環境を作成します。
  1. 必要なライブラリをインストールします。
  1. API キーを設定します。
各パッケージは、本ページの例のそれぞれ異なる部分を担っています。
本ページの例は、langchain-sambanova 1.1.1、langgraph 1.2.10、langchain 1.3.14 で動作確認済みです。まったく同じ組み合わせを再現するには、pip install langchain-sambanova==1.1.1 langchain==1.3.14 langgraph==1.2.10 でバージョンを固定してください。

クイックスタート

SambaCloud のチャットモデルをインスタンス化し、最初のメッセージを送信します。
以下のような出力が表示されます。
ChatSambaNova は環境変数 SAMBANOVA_API_KEY からキーを読み取ります。invoke は AIMessage を返すため、response.content が応答テキストになります。応答が表示されれば、モデルをグラフに組み込む準備は完了です。

グラフの構築

モデルを単一ノードのグラフに追加します。MessagesState スキーマは add_messages リデューサーを使用するため、各ノードの戻り値は会話を置き換えるのではなく、会話に追記されます。
以下のような出力が表示されます。
graph.invoke は単一の応答ではなく、最終状態を返します。MessagesState は蓄積型のため、result["messages"] には会話全体が格納されます。先頭が入力で、末尾がモデルの AIMessage です。この例で result.content ではなく result["messages"][-1].content を読み取っているのはそのためです。 代わりに状態全体を出力すると、参照しているデータの形を確認できます。

ツールと条件付きエッジの追加

ノードが 1 つだけでは、まだエージェントとは言えません。ツールを呼び出すかどうかをモデルに判断させるには、ツールをモデルにバインドし、ツールを実行する ToolNode を追加し、条件付きエッジで両者の間をルーティングします。tools_condition は最後のメッセージを検査し、ツール呼び出しが含まれていれば "tools" を返し、含まれていなければグラフを終了します。tools から model へ戻るエッジがループを構成するため、モデルは各ツールの結果を確認したうえで、別のツールを呼び出すか応答を返すかを選択できます。
上記の get_exchange_rate ツールは、2 つ目の API キーなしで例を実行できるよう、ハードコードされたレートを返します。数値を実際に利用する場合は、実際のレート API に置き換えてください。
各メッセージに対する pretty_print は、ループが実際に実行されたことを確認する最も手軽な方法です。質問、モデルのツール呼び出し、ツールの結果、最終的な応答の 4 つのメッセージが表示されるはずです。
メッセージが 2 つ (質問とテキスト応答) しか表示されない場合、モデルはツール呼び出しを発行していません。モデルが Function calling に対応していることを確認し、ツールをいつ使うべきかが明確に伝わるように docstring を記述してください。
このグラフを必ずしも手作業で構築する必要はありません。from langchain.agents import create_agent を使えば、同等のコンパイル済み ReAct エージェントを 1 回の呼び出しで取得できます。独自のノード、カスタムルーティング、状態フィールドを追加する必要がある場合に、グラフを自分で構築してください。

ターンをまたいだ状態の永続化

graph.invoke の各呼び出しは毎回新しい状態から始まるため、上のグラフは何も記憶できません。会話を維持するには、チェックポインターを指定してコンパイルし、thread_id を渡します。チェックポインターはスレッドごとに状態を保存し、thread_id でどの会話を継続するかを選択します。
以下のような出力が表示されます。
2 回目の呼び出しで送信しているのは新しい質問だけですが、チェックポインターが conversation-1 の保存済みメッセージを復元するため、モデルは最初のターンの内容を保持しています。thread_id を新しい値に変更すると、モデルは名前を知らない状態に戻ります。
InMemorySaver は状態をプロセス内に保持し、終了時に失われます。これはローカル開発に適した挙動です。MemorySaver は同じクラスの後方互換エイリアスです。デプロイする用途では、langgraph-checkpoint-postgres の PostgresSaver など、永続化されるチェックポインターを使用してください。

ユースケースの例

LangGraph を SambaCloud と組み合わせて使用することで、Web 検索、検索拡張生成 (RAG)、SQL エージェントなどのマルチエージェントワークフローを構築できます。以下は、これらのパターンをそのまま実行できる完全な実装例です。
  • Agentic Search: Web 検索ツールと SambaCloud のモデルを組み合わせたチャットボットを構築するノートブックです。
  • Agentic Graph RAG: ノートブックではなく完全なアプリケーションで、インテリジェントなルーティングと生成された Cypher クエリを使用して、医療系グラフデータベースに対する自然言語の質問に回答します。LangGraph と FastAPI で構築され、Web インターフェースを備えています。

トラブルシューティング

macOS には python 実行ファイルが用意されておらず、python3 のみが提供されます。仮想環境の作成には python3 -m venv .venv を使用してください。source .venv/bin/activate で有効化した後は、環境内で python が期待どおりに動作します。
ChatSambaNova はオブジェクトの構築時に HTTP クライアントを作成するため、SAMBANOVA_API_KEY が未設定の場合、リクエストが送信される前の ChatSambaNova(...) の行で失敗します。echo $SAMBANOVA_API_KEY で、キーがプロセスから参照できることを確認してください。export は実行したシェルにのみ適用されるため、新しいターミナルや新しいエディタセッションでは再度設定が必要です。
キーは設定されていますが、有効ではありません。SambaCloud ポータル からもう一度コピーしてください。
仮想環境が有効になっていません。source .venv/bin/activate を再度実行し、プロンプトに (.venv) が表示されることを確認してから、ステップ 2 のインストールコマンドを再実行してください。
model= を省略すると、ChatSambaNova は自身のデフォルトである Llama-4-Maverick-17B-128E-Instruct にフォールバックします。このモデルは SambaCloud では提供終了となりすでに提供されていないため、別のモデルで気付かないうちに実行されるのではなく、リクエストが失敗します。常に model= を明示的に指定し、SambaCloud モデル に記載の ID を使用してください。
古いチュートリアルでは ChatSambaNovaCloud をインポートしています。langchain-sambanova 1.x では、この名前は実装を持たない非推奨 (deprecated) のプレースホルダです。クラスには @deprecated(since="0.2.0", removal="1.0.0") が付与され、本体は空になっています。ChatSambaNova を使用してください。SambaCloud と SambaStack の両方に対応し、base_url からどちらに接続するかを選択します。
グラフの結果に対して .content を呼び出しています。graph.invoke が返すのはメッセージではなく状態のディクショナリなので、まず result["messages"][-1].content のように状態から最後のメッセージを取り出してください。.content を直接読み取れる AIMessage を返すのは llm.invoke だけです。
チェックポインター付きでグラフをコンパイルしたにもかかわらず、config なしで呼び出しています。チェックポインターはどの会話を読み込むかを知る必要があるため、毎回の呼び出しで thread_id を渡してください: graph.invoke(payload, {"configurable": {"thread_id": "conversation-1"}})。会話を継続するには同じ値を再利用し、新しい会話を始めるには新しい値を使用します。
グラフが END に到達せずループし続けています。ツール呼び出しグラフでは通常、モデルがツールを呼び出し、結果に満足できず、再度呼び出すことが原因です。message.pretty_print() でメッセージを出力し、何が繰り返されているかを確認してください。例外を送出するのではなく、利用可能な回答か明確なエラー文字列を返すようにツールを修正し、完了の判断基準がモデルに伝わるように docstring を明確にしてください。上限を引き上げるのは、ループ自体が正しく動作するようになってからにします: graph.invoke(payload, {"recursion_limit": 50})。
langgraph-prebuilt 1.1 以降では、create_react_agent は非推奨です。from langgraph.prebuilt import create_react_agent を from langchain.agents import create_agent に置き換え、create_agent(model, tools) を呼び出してください。ToolNode と tools_condition は非推奨ではないため、上で示した手組みのグラフは引き続き有効です。
よくある原因は 2 つあります。1 つ目は、モデルが Function calling に対応しておらず、そもそもツール呼び出しを発行できないケースです。Function calling と JSON モード で対応状況を確認してください。2 つ目は、グラフは構築したもののツールをバインドしておらず、モデルがツールの存在を知らないケースです。ToolNode(tools) はツール呼び出しを実行するだけで、ツールの存在をモデルに知らせるわけではありません。グラフ内の ToolNode(tools) と、モデルへの .bind_tools(tools) の両方が必要です。

参考情報