APIキーなしのLangChainとLangGraph
キーなしでホストモデルを実行することはできませんが、まず支払いなしでLangChainとLangGraphを実行することはできます。ワンクリックの試用キーとベースURLの変更だけで十分です。

更新日:
主要ポイント
すべてのホストエンドポイントにはキーが必要です。試用キーにはカードは不要で、ワンクリックで取得できます。
base_urlとモデルをuncensoredに設定すれば、LangChainのChatOpenAIクラスは動作します。
ツール呼び出しを行うLangGraphエージェントは変更なしで動作しますが、ファンアウトブランチは同時実行数の制限を尊重する必要があります。
典型的な6回呼び出しのエージェントランは約$0.0039かかり、$0.50の試用でそのようなランが約128回カバーできます。
「APIキーなし」が現実的に意味するもの
APIキーなしのlangchainとlangraphを検索することは、通常3つの意味のいずれかを表します。スタックが動作する前に支払いを避けたいのかもしれません。また、新たなベンダーにクレジットカードを渡したくないのかもしれません。あるいは、何の認証情報もなしにエージェントグラフを実行したいのかもしれません。
3番目の願いは、ホストサービスでは叶いません。あなたに代わって作業を行うサーバーは、誰が呼び出しているかを知らなければなりません。あなたが得られるのは、コストゼロでカード不要のキーです。Googleまたはメールとパスワードでサインアップ後、このサイトのAPIキーページでワンクリックして$0.50の試用クレジットを取得できます。これは1人1回限りで、7日間有効です。
「キーなし」への別の方法は、あなたのマシン上の何らかのソフトウェアによって提供されるローカルモデルです。これは機能しますが、ハードウェアの負担があり、ラップトップは長時間のエージェントランではホストエンドポイントに及びません。ホストトライアルは、グラフロジックが正しいかどうかを確認するより速い方法であり、あなたが書くコードは、後に資金付きキーで実行するコードと同一です。
エンドポイントはOpenAI互換であるため、LangChainは特別な統合を必要としません。OpenAIチャットクラスを異なるベースURLにポイントし、キーを与え、モデル名にuncensoredを指定します。以下は、このセットアップを前提としています。
ステップ1:試用キーの取得と環境設定
サインアップし、キーページを開き、試用ボタンを押します。キーをコピーしてリポジトリから外に保管してください。環境変数に設定することで、同じスクリプトが今日の試用キーと将来のフルキーの両方で動作します。
export UNCENSORED_API_KEY="paste-your-key-here"
pip install -U langchain-openai langgraph langchain-core
フレームワークを関与させる前に、プレーンなリクエストでキーを確認してください。ここで2分費やすことで、実際には認証エラーであるスタックトレースを読むのに要する1時間を節約できます。
curl https://api.stableaudio.top/v1/chat/completions \
-H "Authorization: Bearer $UNCENSORED_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"uncensored","messages":[{"role":"user","content":"Reply with one word: ready"}]}'
GET /v1/models呼び出しは別の迅速なチェックです。uncensoredをリスト表示するはずです。試用キーは同時2リクエスト、1分あたり60リクエストを許可します。これはグラフの開発には十分ですが、並列ノードを追加する際に覚えておくと役立ちます。
ステップ2:LangChainをエンドポイントに接続
使用するクラスはChatOpenAI(langchain-openai由来)です。処理を行うには2つの引数、すなわちbase_urlとapi_keyが必要です。モデル名はuncensoredで、通常のサンプリング設定はそのまま渡されます。
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.stableaudio.top/v1",
api_key=os.environ["UNCENSORED_API_KEY"],
temperature=0.7,
max_retries=3,
)
print(llm.invoke("Give me three titles for an ambient track about rain.").content)
これがテキストを出力すれば、接続は良好です。ストリーミングも同じ方法で動作します:llm.stream(...)を反復処理し、チャンクはサーバー送信イベント(SSE)で到着し、ストリームの最後に使用量が報告されます。
よくあるミスは、古いプロジェクトからOPENAI_API_KEY変数が設定されたままになっていることです。api_keyを渡すのを忘れた場合、LangChainはその値をカスタムベースURLに送信します。キーを明示的に渡せば、推測の余地を排除できます。
ステップ3:最小限のLangGraphグラフ
LangGraphはエージェントをノード間で移動する状態としてモデル化します。最も有用な小さなグラフは、モデルを呼び出し、返信をメッセージリストに追加する1つのノードを持っています。MessagesStateは、そのリストを無料で提供します。
from langgraph.graph import StateGraph, MessagesState, START, END
def call_model(state: MessagesState):
reply = llm.invoke(state["messages"])
return {"messages": [reply]}
builder = StateGraph(MessagesState)
builder.add_node("model", call_model)
builder.add_edge(START, "model")
builder.add_edge("model", END)
graph = builder.compile()
out = graph.invoke({"messages": [("user", "Outline a three-act short story about a lighthouse keeper.")]})
print(out["messages"][-1].content)
これは意図的にシンプルです。ポイントは、LangGraphの何ものもllmの背後にあるプロバイダーを知らず、気にしないということです。どのノードでも異なるモデルオブジェクトを取ることができるため、後に安価な計画ステップと長い書き込みステップにそれぞれ独自の設定(計画用の低い温度など)を与えることができます。
ステップ4:ツールとループの追加
モデルが関数を呼び出せるようになると、エージェントは面白くなります。エンドポイントはtoolsとtool_choiceによるツール呼び出しをサポートし、ツール結果はrole: "tool"メッセージとして戻ります。LangChainとLangGraphはこれをあなたのために処理します。
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode, tools_condition
@tool
def word_count(text: str) -> int:
'Count the words in a piece of text.'
return len(text.split())
tools = [word_count]
llm_with_tools = llm.bind_tools(tools)
def agent(state: MessagesState):
return {"messages": [llm_with_tools.invoke(state["messages"])]}
builder = StateGraph(MessagesState)
builder.add_node("agent", agent)
builder.add_node("tools", ToolNode(tools))
builder.add_edge(START, "agent")
builder.add_conditional_edges("agent", tools_condition)
builder.add_edge("tools", "agent")
graph = builder.compile()
result = graph.invoke({"messages": [("user", "Write a 40-word product blurb, then check its word count with the tool.")]})
print(result["messages"][-1].content)
ループが全体です:エージェントノードが回答し、tools_conditionが返信がツールを要求したかどうかを確認し、ツールノードがそれを実行し、制御がエージェントに戻ります。返信にツール呼び出しがない場合、グラフは終了します。
オープンウェイトモデルは、ツール引数の整理具合が異なります。呼び出しが壊れた形式で戻ってきた場合は、ツールのdocstringを厳密にし、温度を下げ、引数スキーマを小さく保ってください。オプションフィールドが多い長いスキーマよりも、短く型指定されたスキーマの方が失敗しにくいです。
レート制限、リトライ、並列ブランチ
エージェントグラフが最もつまずきやすいのは並列処理です。完全なAPIキーでは同時実行リクエスト8件、1分あたり300件のリクエストが許可されます。試用キーではそれぞれ2件と60件です。試用キーでグラフが5つのノードに並列に分岐すると、3つがHTTP 429で拒否され、エラーコードconcurrencyが返されます。1分あたりの予算を超えるとrate_limitedが返されます。一時的な過負荷でも429が返され、Retry-After: 5ヘッダーが付加されます。
これを管理可能にするための3つの習慣:
max_retriesを2または3に設定し、ChatOpenAIで短い429エラーをバックオフ付きで再試行してください。- ファンアウトを同時実行数の制限に制限します。LangGraphでは、グラフを呼び出す際に
config={"max_concurrency": 2}を渡すことができます。 - ストリーミングリクエストはストリームが終了するまでスロットを保持するため、低速な消費側(クライアント)はスロットを占有し続けます。
out = graph.invoke(
{"messages": [("user", "Draft five taglines in parallel.")]},
config={"max_concurrency": 2},
)
レスポンスヘッダーはデバッグに役立ちます。X-Request-Idは、サポートに問い合わせる必要がある場合に呼び出しを識別し、X-Balance-USDは各リクエスト後に残高クレジットを表示します。
グラフが正常に動作しない場合のデバッグチェックリスト
最初のLangGraphプロジェクトでの失敗のほとんどはモデルに関するものではありません。設定に起因するもので、短いチェックリストでほぼすべてをキャッチできます。
- 401または認証エラー。 キーが不足、誤入力、または古い
OPENAI_API_KEYが読み取られています。スクリプトが実際に使用する値の最初の4文字を出力してください。 - 404またはモデルが見つかりません。 モデル名は
uncensoredでなければなりません。エンドポイントが何をリストしているか不明な場合はGET /v1/modelsを呼び出してください。 - 接続エラー。 ベースURLは
/v1で終わる必要があり、/chat/completionsを含めてはいけません。クライアントがその部分を追加します。 - 無限ループ。 エージェントがツールを呼び出し続ける場合、ツールの戻り値が質問に答えていない可能性があります。プレーンで短い文字列を返し、グラフ設定を通じて再帰制限を設定して、悪いループを早期に停止させます。
- 空または奇妙な返信。 実行後にメッセージリスト全体を出力してください。以前のノードが後のメッセージと矛盾するシステムメッセージを書き込んでいることが多いです。
サーバー側でリクエストが失敗した場合、メッセージにX-Request-Idヘッダーを引用し、サポートに送信してください。これにより、推測なしでその正確な呼び出しを見つけることができます。失敗または拒否されたリクエストは課金されないことも覚えておいてください。したがって、エラーでいっぱいのデバッグセッションは試用クレジットを消費しません。
もう1つの設計ポイント。各ノードに狭いジョブと短いプロンプトを与えてください。プランナー、ライター、チェッカーを持つグラフは、それぞれが独自の小さなシステムメッセージを持ち、単一のノードに指示のページを持つものよりもテストが容易です。各部分は、接続する前に直接llm.invoke呼び出しで単独で試すことができます。
実際のトライアルランのコスト
料金は前払いクレジットから、入力トークン1Mあたり$0.15、出力トークン1Mあたり$0.50です。失敗または拒否されたリクエストには課金されません。エージェントグラフはタスクごとにモデルを複数回呼び出し、呼び出しごとにメッセージリストが再送信されるため、入力トークンが大部分を占めます。
6回のモデル呼び出しでテストしてみましょう。各呼び出しで3,000トークンを入力し、400トークンを出力するとします。合計で18,000トークンの入力と2,400トークンの出力になります。
- 入力: 18,000 / 1,000,000 x $0.15 = $0.0027
- 出力: 2,400 / 1,000,000 x $0.50 = $0.0012
- 合計: 1回あたり $0.0039
$0.50のトライアルクレジットを$0.0039で割ると、その規模のグラフが約128回実行可能で、グラフの構築とテストに十分な量です。トライアルでは物足りなくなったら、チャージは$20から$500まで整数単位で可能で、$50以上で5%、$100以上で10%、$200以上で15%のボーナスが付きます。詳細は料金ページをご覧ください。カード(Visa、Mastercard、Apple Pay、Google Pay)または暗号資産(TRC20上のUSDT、Base上のUSDC)でお支払いいただけます。クレジットは期限切れせず、プロンプトはトレーニングに使用されません。
プロンプトと補完(completion)を合わせたコンテキストウィンドウは100,000トークンなので、長いエージェントの履歴でも収まりますが、再送信するトークンすべてに対して課金されます。LangGraphのメッセージユーティリティを使用して古いメッセージをトリミングすることで、コストとレイテンシを抑制できます。これらを支える生のリクエスト形式については、APIドキュメントをご覧ください。
その他のガイド
質問と回答
APIキーなしでLangChainやLangGraphを使用できますか?
ホストされたモデルではありません。サーバーは呼び出し元を識別する必要があります。ワンクリックで無料トライアルキーを取得でき、カード不要です。または、ローカルモデルを自分で実行することもできます。
どのLangChainクラスを使うべきですか?
langchain-openaiのChatOpenAIを使用します。base_urlをエンドポイントに設定し、api_keyとしてキーを渡して、モデル名にuncensoredを使用します。
LangGraphエージェント内で関数呼び出しは機能しますか?
はい。エンドポイントはツール、tool_choice、role: toolの結果をサポートしており、上記の例と同様にbind_tools、ToolNode、tools_conditionが機能します。
グラフが並列で分岐を実行する際に429エラーが発生するのはなぜですか?
同時実行数の制限を超えました。トライアルキーでは2、フルキーでは8です。グラフ設定でmax_concurrencyを制限し、リトライを有効にしてください。
トライアルクレジットはエージェントのテストに十分な量ですか?
通常は十分です。6回の呼び出しを含む適度なサイズのランで約$0.0039かかりますが、$0.50は7日間の有効期間内に100回以上のランをカバーするのに十分です。