前提条件
作業を始める前に、以下の環境を準備してください。- 有効な 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 非対応のモデルでツール呼び出しグラフを実行すると、モデルはツール呼び出しを一切発行しないため、グラフは通常のテキスト応答を返し、ツールノードは完全にスキップされます。
インストールとセットアップ
- 仮想環境を作成します。
- 必要なライブラリをインストールします。
- 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 つのメッセージが表示されるはずです。
from langchain.agents import create_agent を使えば、同等のコンパイル済み ReAct エージェントを 1 回の呼び出しで取得できます。独自のノード、カスタムルーティング、状態フィールドを追加する必要がある場合に、グラフを自分で構築してください。ターンをまたいだ状態の永続化
graph.invoke の各呼び出しは毎回新しい状態から始まるため、上のグラフは何も記憶できません。会話を維持するには、チェックポインターを指定してコンパイルし、thread_id を渡します。チェックポインターはスレッドごとに状態を保存し、thread_id でどの会話を継続するかを選択します。
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 インターフェースを備えています。
トラブルシューティング
command not found: python
command not found: python
python 実行ファイルが用意されておらず、python3 のみが提供されます。仮想環境の作成には python3 -m venv .venv を使用してください。source .venv/bin/activate で有効化した後は、環境内で python が期待どおりに動作します。sambanova.SambaNovaError: The api_key client option must be set
sambanova.SambaNovaError: The api_key client option must be set
ChatSambaNova はオブジェクトの構築時に HTTP クライアントを作成するため、SAMBANOVA_API_KEY が未設定の場合、リクエストが送信される前の ChatSambaNova(...) の行で失敗します。echo $SAMBANOVA_API_KEY で、キーがプロセスから参照できることを確認してください。export は実行したシェルにのみ適用されるため、新しいターミナルや新しいエディタセッションでは再度設定が必要です。sambanova.AuthenticationError: Error code: 401 - Incorrect API key provided
sambanova.AuthenticationError: Error code: 401 - Incorrect API key provided
ModuleNotFoundError: No module named 'langgraph' or 'langchain_sambanova'
ModuleNotFoundError: No module named 'langgraph' or 'langchain_sambanova'
source .venv/bin/activate を再度実行し、プロンプトに (.venv) が表示されることを確認してから、ステップ 2 のインストールコマンドを再実行してください。モデルを指定していないのにモデルのエラーが発生する
モデルを指定していないのにモデルのエラーが発生する
model= を省略すると、ChatSambaNova は自身のデフォルトである Llama-4-Maverick-17B-128E-Instruct にフォールバックします。このモデルは SambaCloud では提供終了となりすでに提供されていないため、別のモデルで気付かないうちに実行されるのではなく、リクエストが失敗します。常に model= を明示的に指定し、SambaCloud モデル に記載の ID を使用してください。ChatSambaNovaCloud が動作しない
ChatSambaNovaCloud が動作しない
ChatSambaNovaCloud をインポートしています。langchain-sambanova 1.x では、この名前は実装を持たない非推奨 (deprecated) のプレースホルダです。クラスには @deprecated(since="0.2.0", removal="1.0.0") が付与され、本体は空になっています。ChatSambaNova を使用してください。SambaCloud と SambaStack の両方に対応し、base_url からどちらに接続するかを選択します。AttributeError: 'dict' object has no attribute 'content'
AttributeError: 'dict' object has no attribute 'content'
.content を呼び出しています。graph.invoke が返すのはメッセージではなく状態のディクショナリなので、まず result["messages"][-1].content のように状態から最後のメッセージを取り出してください。.content を直接読み取れる AIMessage を返すのは llm.invoke だけです。ValueError: Checkpointer requires one or more of the following 'configurable' keys: thread_id, checkpoint_ns, checkpoint_id
ValueError: Checkpointer requires one or more of the following 'configurable' keys: thread_id, checkpoint_ns, checkpoint_id
thread_id を渡してください: graph.invoke(payload, {"configurable": {"thread_id": "conversation-1"}})。会話を継続するには同じ値を再利用し、新しい会話を始めるには新しい値を使用します。langgraph.errors.GraphRecursionError: Recursion limit of 25 reached
langgraph.errors.GraphRecursionError: Recursion limit of 25 reached
END に到達せずループし続けています。ツール呼び出しグラフでは通常、モデルがツールを呼び出し、結果に満足できず、再度呼び出すことが原因です。message.pretty_print() でメッセージを出力し、何が繰り返されているかを確認してください。例外を送出するのではなく、利用可能な回答か明確なエラー文字列を返すようにツールを修正し、完了の判断基準がモデルに伝わるように docstring を明確にしてください。上限を引き上げるのは、ループ自体が正しく動作するようになってからにします: graph.invoke(payload, {"recursion_limit": 50})。LangGraphDeprecatedSinceV10: create_react_agent has been moved to langchain.agents
LangGraphDeprecatedSinceV10: create_react_agent has been moved to langchain.agents
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 は非推奨ではないため、上で示した手組みのグラフは引き続き有効です。モデルがテキストで応答し、ツールを呼び出さない
モデルがテキストで応答し、ツールを呼び出さない
ToolNode(tools) はツール呼び出しを実行するだけで、ツールの存在をモデルに知らせるわけではありません。グラフ内の ToolNode(tools) と、モデルへの .bind_tools(tools) の両方が必要です。参考情報
- LangGraph の公式ドキュメント: グラフ API の全体像、永続化バックエンド、ストリーミングオプション
- PyPI の langchain-sambanova: コンストラクターオプションと
ChatSambaNovaのリファレンス - SambaCloud モデル: 最新のモデル ID、コンテキストウィンドウ、Function calling 対応モデル
- Function calling と JSON モード: ツール呼び出しを発行できるモデルの確認
- SambaCloud API リファレンス

