- 技術 💻
Langfuseとは|使い方・料金・セルフホストとSDKの送信を実例で解説
結論
Langfuseとは、LLMアプリの呼び出し・費用・品質を記録して調べる、オープンソースの観測ツールです。Cloud でもセルフホストでも使えます。
この記事でわかること
- SDK・OpenTelemetryが送る3通りの通信の実物
- 観測の型10種と、プロンプト・評価の動く例
- Cloud 4プランの料金試算とセルフホストの6構成
アプリに入れた SDK(または OpenTelemetry)が、LLM の呼び出しや検索・ツールの実行を1件ずつ Langfuse の受け口へ送ります。Langfuse はそれを保存し、画面で流れ・トークン数・費用を見せ、評価のスコアやプロンプトの版と結び付けます。
flowchart TD
A[LLM アプリ] -->|SDK・OTLP| B[Langfuse の受け口]
B --> C[(ClickHouse に保存)]
C --> D[トレース・費用の画面]
C --> E[評価・スコア]
F[プロンプト管理] -->|版を取得| A
よく出る言葉を先にまとめます。
| 言葉 | 何か | 例 |
|---|---|---|
| トレース | 1回のリクエストの記録のまとまり | 1回のチャットの応答 |
| オブザベーション | トレースの中の1つ1つの処理 | 検索・ツール・LLM 呼び出し |
| 生成(generation) | LLM 呼び出しのオブザベーション | モデル名・トークン数・費用 |
| スコア | 品質の評価の値 | helpfulness = 1 |
| セッション | 複数のトレースのまとまり | 1つの会話スレッド |
| プロンプト管理 | プロンプトを版とラベルで管理 | production の版を取得 |
| データセット | 評価に使うテストケースの集まり | 質問と期待する答え |
| units | Cloud の課金の数え方 | トレース+オブザベーション+スコアの件数 |
| 料金 | Hobby は無料(月5万 units) | Core は月29ドル |
確認環境:Ubuntu 24.04・Python 3.11.15・Node.js 22.22.2。Python SDK langfuse 5.0.4(OpenTelemetry SDK 1.45.1、openai 3.37.0、langchain-core 1.7.0・langchain-openai 1.7.2)、JS/TS SDK @langfuse/tracing・@langfuse/otel 6.0.2(@opentelemetry/sdk-node 0.223.0)。SDK の送り先を Langfuse の代わりに自作の擬似の受け口(HTTP サーバー)へ向け、届いたリクエストのヘッダーと本文を記録しました。OTLP の protobuf は opentelemetry-proto で JSON に直して中身を見ました。LLM も OpenAI 互換の擬似サーバーで、本物の Langfuse・OpenAI には接続していません。セルフホストの構成は GitHub の langfuse/langfuse(サーバー v4.68.0、2026年10月22日のコミット)の docker-compose.yml とソースで、モデルの単価の定義は同じソースの default-model-prices.json で確かめました。仕様・料金は langfuse.com のドキュメントと料金ページ、LangSmith は langchain.com の料金ページ、Arize Phoenix は arize.com のドキュメントで確かめました(確認日 2026年10月23日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Langfuseとは|使い方・料金・セルフホストとSDKの送信を実例で解説」
Langfuseとは(読み方・開発元・ライセンス)
この節では、Langfuse が何をする道具で、だれが作っていて、無料で使える範囲がどこまでかが分かります。
Langfuse は、LLM を使うアプリ(チャットボット・RAG・AI エージェントなど)の中で何が起きたかを記録し、調べ、評価するためのオープンソースのプラットフォームです。 日本語では「ラングフューズ」と書かれることが多い名前です。公式は自らを「open-source AI engineering platform」と説明し、トレース(観測)・評価・プロンプト管理・データセットを1つにまとめています。
| 項目 | 内容(2026年10月23日時点) |
|---|---|
| 開発元 | Langfuse。2026年1月16日に ClickHouse による買収を公式ブログで発表 |
| ライセンス | MIT(ee/ など一部のディレクトリだけ別のライセンス) |
| 現行のサーバー | v4(GitHub の最新は v4.68.0) |
| 使い方 | Langfuse Cloud(US・EU・日本・HIPAA のリージョン)か、セルフホスト |
| SDK | Python(v5)・JS/TS(v6)。ほかの言語は OpenTelemetry で送る |
| 画面の言語 | 英語 |
買収の発表では、オープンソースとセルフホストを続けること、ライセンスを変える予定がないこと、Langfuse Cloud はそのまま動き続けることが書かれています。リポジトリの LICENSE の著作権表示も「ClickHouse, Inc.」になっています。
LLMアプリに「観測」が要る理由
ふつうの Web アプリは、同じ入力なら同じ結果を返します。LLM アプリは同じ質問でも答えが変わり、1回の応答の中で検索・ツール呼び出し・複数回の LLM 呼び出しが起きます。エラーにならなくても「答えが間違っている」「急に費用が増えた」が起きるので、ログだけでは原因を追えません。
APM(New Relic など)は処理時間とエラーが中心。Langfuse は LLM の入力・出力と品質の評価が中心
Langfuseでできること(トレース・コスト・評価・プロンプト管理・データセット)
この節では、Langfuse の主な機能と、それぞれで何が分かるかが分かります。
| 機能 | 何が分かる・できるか | 主な使い方 |
|---|---|---|
| トレース(観測) | 1回の処理の流れ、入力・出力、時間 | SDK の @observe、OpenTelemetry |
| トークンとコスト | モデルごとのトークン数と費用(USD) | モデル名とトークン数から自動計算 |
| セッション・ユーザー | 会話ごと・利用者ごとのまとまり | session_id・user_id を付ける |
| 評価(スコア) | 品質の点数(数値・真偽・カテゴリ・文章) | SDK・画面・LLM-as-a-judge・利用者の評価 |
| プロンプト管理 | プロンプトの版とラベル、どの版で答えたか | get_prompt()、ラベル production |
| データセットと実験 | テストケースで変更前後を比べる | run_experiment()、CI の GitHub Action |
| ダッシュボード・アラート | 費用・遅さ・スコアの推移と通知 | 画面で作成 |
| プレイグラウンド | プロンプトを画面で試す | LLM の API キーを登録 |
| 公開 API | データの取得・書き込み | REST、Observations API v2 |
1どこで遅い・高いかが分かる
検索・ツール・LLM 呼び出しの1つ1つの時間とトークン数が、親子の木で並ぶ。
2答えの品質を数字で追える
スコアを付けると、プロンプトやモデルを変えたときに良くなったかを比べられる。
3プロンプトをコードから外せる
画面で版を作り、ラベルを付け替えるだけで本番のプロンプトを変えられる。
4OpenTelemetry に乗っている
SDK の中身は OpenTelemetry。他の言語やフレームワークからも OTLP で送れる。
Langfuseの仕組みとデータモデル(トレース・オブザベーション・セッション・スコア)
この節では、Langfuse がデータをどんな単位で持っているかと、v4 で何が変わったかが分かります。
データの基本は「オブザベーション(observation)」です。 公式ドキュメントでは、オブザベーションはアプリの1つ1つの処理(LLM 呼び出し・ツール呼び出し・検索など)で、入れ子にできます。同じ trace_id を持つオブザベーションのまとまりがトレース、複数のトレース(会話の1往復ずつ)をまとめたものがセッションです。スコアはトレース・オブザベーション・セッションのどれかに付けます。
flowchart TD
S[セッション] --> T1[トレース 1回目]
S --> T2[トレース 2回目]
T1 --> O1[span 全体]
O1 --> O2[retriever 検索]
O1 --> O3[generation LLM]
オブザベーションの型(10種類)
オブザベーションには型があり、画面で絞り込みやすくなります。Python は as_type、JS/TS は asType で指定します。
| 型 | 何を表すか(公式の説明の要約) |
|---|---|
span |
処理の時間を表す汎用の型(既定) |
generation |
AI モデルの生成。プロンプト・トークン数・費用を持つ |
event |
時間を持たない、その瞬間の出来事 |
agent |
アプリの流れを決める役(LLM の判断でツールを使うなど) |
tool |
1つの動作(関数や外部 API の呼び出し) |
chain |
処理と処理のつなぎ(検索結果を LLM に渡すなど) |
retriever |
状態を変えずに調べる処理(ベクトルストア・DB の検索) |
evaluator |
LLM の出力の良し悪しを判定する関数 |
embedding |
埋め込みの生成。モデル・トークン数・費用を持つ |
guardrail |
有害な内容や脱獄の試みを防ぐ部品 |
v4(observations-first)で変わったこと
Langfuse v4 では、保存の形が「オブザベーションの表1つ」になりました。公式の v4 のページによると、トレースは同じ trace_id を持つ行の集まりで、user_id・session_id・タグなどのトレース単位の値は全部の行に写して持ちます。
| 項目 | 内容(公式ドキュメント) |
|---|---|
| トレースの入力・出力 | 非推奨。評価や表示は、ルートのオブザベーションや LLM 呼び出しの入力・出力を使う |
| Langfuse Cloud | 2026年3月から v4 のプレビュー。2026年11月16日に v4 だけになり、v3 までの API(legacy)と取り込み口が廃止される |
| セルフホスト | v4 は2026年7月29日に一般提供。v3 のセキュリティ修正は2027年1月31日まで |
| SDK との対応 | Python SDK v5・JS/TS SDK v6 は v4 が必要(セルフホストは v4.59.0 以上) |
既存の v3 のセルフホストに Python SDK v5 を向けると対応外です。セルフホストのまま v3 を使うなら Python SDK v4・JS/TS SDK v5 を使います。
Langfuseの始め方(アカウント作成からトレース送信まで)
この節では、Langfuse Cloud で最初のトレースを送るまでの順番が分かります。
リージョンを選んでサインアップ
Langfuse Cloud は US・EU・日本(JP)を選べます。Hobby プランはクレジットカードなしで始められます。
組織とプロジェクトを作る
データはプロジェクトごとに分かれます。本番と開発でプロジェクトを分けるか、環境(environment)で分けます。
API キーを作る
プロジェクトの設定で、公開キー(pk-lf- で始まる)と秘密キー(sk-lf- で始まる)を作ります。
SDK を入れて環境変数を設定
pip install langfuse か npm install @langfuse/tracing @langfuse/otel。キーと送り先を環境変数に入れます。
関数に @observe を付けて実行
トレースの一覧に1件出れば成功です。短いスクリプトは最後に flush() で送り切ります。
環境変数は次の4つです。LANGFUSE_BASE_URL を書かないと、SDK は EU の https://cloud.langfuse.com に送ります(SDK の既定値)。
LANGFUSE_PUBLIC_KEY="pk-lf-..."
LANGFUSE_SECRET_KEY="sk-lf-..."
LANGFUSE_BASE_URL="https://jp.cloud.langfuse.com" # 日本リージョンの例
LANGFUSE_TRACING_ENVIRONMENT="production" # 任意。既定は default
| リージョン | LANGFUSE_BASE_URL |
|---|---|
| EU(SDK の既定) | https://cloud.langfuse.com |
| US | https://us.cloud.langfuse.com |
| 日本 | https://jp.cloud.langfuse.com |
| HIPAA(Pro 以上) | https://hipaa.cloud.langfuse.com |
| セルフホスト | http://localhost:3000 など自分の URL |
Python SDKでトレースを送る(擬似の受け口で受けた実物)
この節では、Python SDK の書き方と、そのとき実際にどんなリクエストが何回送られるかが分かります。
サポートのチャットボットを想定し、プロンプトを Langfuse から取得し、FAQ を検索し、利用者のプランを調べてから LLM に答えさせる小さなプログラムを書きました。OpenAI SDK は langfuse.openai から読み込むと、呼び出しが自動で記録されます。
import time
from langfuse import get_client, observe, propagate_attributes
from langfuse.openai import OpenAI # OpenAI SDK を Langfuse が包んだもの
langfuse = get_client() # LANGFUSE_* の環境変数を読む
llm = OpenAI() # OPENAI_BASE_URL・OPENAI_API_KEY を読む
@observe(as_type="retriever")
def search_faq(question: str) -> list[str]:
time.sleep(0.02)
return ["FAQ-12: パスワードの再設定は「設定」→「アカウント」"]
@observe(as_type="tool")
def get_user_plan(user_id: str) -> dict:
return {"plan": "pro"}
@observe() # 既定は span
def answer(question: str, user_id: str) -> str:
prompt = langfuse.get_prompt("support-answer", type="chat") # label 省略時は production
docs = search_faq(question)
plan = get_user_plan(user_id)
messages = prompt.compile(product="RJC Shop", question=question)
res = llm.chat.completions.create(
model=prompt.config["model"], temperature=prompt.config["temperature"],
messages=messages, langfuse_prompt=prompt, # どの版のプロンプトかを記録
metadata={"docs": len(docs), "plan": plan["plan"]},
)
return res.choices[0].message.content
@observe(name="support-chat")
def handle(question: str, user_id: str) -> str:
with propagate_attributes(user_id=user_id, session_id="chat-20261023-01",
tags=["support", "faq"], metadata={"channel": "web"}):
out = answer(question, user_id)
langfuse.score_current_trace(name="helpfulness", value=1, data_type="BOOLEAN", comment="解決した")
print("trace_id:", langfuse.get_current_trace_id())
return out
print("answer:", handle("パスワードを忘れました", "user-1001"))
langfuse.flush() # 短いスクリプトは送ってから終わる
LANGFUSE_BASE_URL と OPENAI_BASE_URL を擬似の受け口(ポート 35601)に向けて実行しました。
trace_id: 92c8b01b0fc9d3a2e1dcb0c135178e1d
answer: パスワードは「設定」→「アカウント」から再設定できます。
1回の実行で届いた4つのリクエスト
=== GET /api/public/v2/prompts/support-answer ← プロンプトの取得
=== POST /v1/chat/completions ← LLM(Langfuse ではなく OpenAI 互換 API へ)
=== POST /api/public/otel/v1/traces (1374 bytes) ← トレース(5件のオブザベーション)
=== POST /api/public/scores (193 bytes) ← スコア
トレースは OpenTelemetry の形式(OTLP/HTTP の protobuf)で送られていました。ヘッダーです。
POST /api/public/otel/v1/traces
user-agent: OTel-OTLP-Exporter-Python/1.45.1
content-type: application/x-protobuf
authorization: Basic cGstbGYtMTIzNDpzay1sZi01Njc4
x-langfuse-sdk-name: python
x-langfuse-sdk-version: 5.0.4
x-langfuse-public-key: pk-lf-1234
x-langfuse-ingestion-version: 4
Content-Encoding: gzip
authorization は「公開キー:秘密キー」を base64 にした Basic 認証です(cGstbGYtMTIzNDpzay1sZi01Njc4 を戻すと pk-lf-1234:sk-lf-5678)。秘密キーは暗号化されずにヘッダーに入るので、送り先は必ず HTTPS にします。
送られたスパンを木にすると
protobuf を JSON に直し、spanId と parentSpanId でつなぐと次の木になりました。型は属性 langfuse.observation.type の値です。
support-chat span 51.9 ms
answer span 50.8 ms
search_faq retriever 20.4 ms
get_user_plan tool 0.2 ms
OpenAI-generation generation 14.9 ms model=gpt-4o-mini-2024-07-18 prompt=support-answer v3
LLM 呼び出しのスパン(OpenAI-generation)に付いていた属性の抜粋です。
user.id = "user-1001"
session.id = "chat-20261023-01"
langfuse.trace.tags = ["support", "faq"]
langfuse.trace.metadata.channel = "\"web\""
langfuse.observation.type = "generation"
langfuse.observation.prompt.name = "support-answer"
langfuse.observation.prompt.version = 3
langfuse.observation.model.name = "gpt-4o-mini-2024-07-18"
langfuse.observation.model.parameters= {"temperature": 0.2, "max_tokens": "Infinity", "top_p": 1, ...}
langfuse.observation.usage_details = {"completion_tokens": 21, "prompt_tokens": 52, "total_tokens": 73, ...}
langfuse.observation.metadata.plan = "\"pro\""
分かったことです。
propagate_attributesで付けたuser_id・session_id・タグ・メタデータは、中のすべてのスパンに写されていました(v4 の「トレース単位の値を全部の行に持つ」形と同じ)。@observeは関数の引数を{"args": [...], "kwargs": {}}の形で入力に、戻り値を出力に入れます。個人情報を送りたくないときは後の「マスキング」の節を見てください。- モデル名は、リクエストの
gpt-4o-miniではなく、応答に入っていたgpt-4o-mini-2024-07-18が入りました。費用の計算はこの名前で行われます。 langfuse_prompt=promptを渡したので、プロンプトの名前と版(3)が LLM 呼び出しに結び付きました。
スコアは別のリクエストで、JSON の配列として送られました。
[
{
"id": "32b1b7ddea51080d",
"traceId": "92c8b01b0fc9d3a2e1dcb0c135178e1d",
"name": "helpfulness",
"value": 1.0,
"comment": "解決した",
"dataType": "BOOLEAN",
"timestamp": "2026-10-23T06:46:48.197562Z"
}
]
flush を書かなかったとき
@observe の関数を1回呼ぶだけのスクリプトで flush() を書かずに終わらせても、終了時に1回の POST が届きました。ただし、AWS Lambda のようにプロセスが終わらずに止まる環境では、終了時の処理が走らないことがあります。公式ドキュメントも、短い処理では flush()(JS は sdk.shutdown())を呼ぶ形を示しています。
SDK の主な環境変数
SDK 5.0.4 のソース(environment_variables.py)にある設定です。
| 環境変数 | 既定値 | 意味 |
|---|---|---|
LANGFUSE_BASE_URL |
https://cloud.langfuse.com |
送り先(LANGFUSE_HOST は非推奨) |
LANGFUSE_TRACING_ENVIRONMENT |
default |
環境名(production・staging など) |
LANGFUSE_RELEASE |
なし | アプリの版。版ごとに集計できる |
LANGFUSE_SAMPLE_RATE |
1.0 |
送るトレースの割合(0〜1) |
LANGFUSE_TRACING_ENABLED |
True |
False で送信を止める |
LANGFUSE_FLUSH_AT・LANGFUSE_FLUSH_INTERVAL |
OpenTelemetry の既定 | まとめて送る件数・間隔(秒) |
LANGFUSE_TIMEOUT |
5 |
API のタイムアウト(秒) |
LANGFUSE_PROMPT_CACHE_DEFAULT_TTL_SECONDS |
60 |
プロンプトのキャッシュの秒数 |
LANGFUSE_OBSERVE_DECORATOR_IO_CAPTURE_ENABLED |
True |
@observe で引数と戻り値を記録するか |
LANGFUSE_OTEL_COMPRESSION |
なし(gzip) | gzip か none |
JavaScript・TypeScript SDKでトレースを送る(Node.js)
この節では、Node.js での書き方と、2026年10月23日時点で npm install が失敗する原因と直し方が分かります。
JS/TS SDK v6 は、OpenTelemetry の Node SDK に LangfuseSpanProcessor を足し、@langfuse/tracing の関数で記録します。必要な Node.js は22以上です。
import { NodeSDK } from "@opentelemetry/sdk-node";
import { LangfuseSpanProcessor } from "@langfuse/otel";
import { startActiveObservation, propagateAttributes } from "@langfuse/tracing";
const sdk = new NodeSDK({ spanProcessors: [new LangfuseSpanProcessor()] });
sdk.start();
await startActiveObservation("support-chat", async (root) => {
root.update({ input: { question: "返品の期限は?" } });
await propagateAttributes({ userId: "user-2002", sessionId: "chat-20261023-02", tags: ["support"] }, async () => {
await startActiveObservation("call-llm", async (gen) => {
gen.update({
model: "gpt-4o-mini",
input: [{ role: "user", content: "返品の期限は?" }],
output: { role: "assistant", content: "到着から30日以内です。" },
usageDetails: { input: 40, output: 12 },
});
}, { asType: "generation" });
});
root.update({ output: "到着から30日以内です。" });
});
await sdk.shutdown(); // 短いスクリプトは送ってから終わる
npm install で ERESOLVE が出る(2026年10月23日時点)
公式ドキュメントのとおり npm install @langfuse/tracing @langfuse/otel @opentelemetry/sdk-node を実行すると、次のエラーで止まりました。
npm error code ERESOLVE
npm error ERESOLVE could not resolve
npm error While resolving: js@1.0.0
npm error Found: @opentelemetry/api@1.9.1
...
npm error Conflicting peer dependency: @opentelemetry/api@1.10.0
npm error peer @opentelemetry/api@">=1.10.0 <1.11.0" from @opentelemetry/sdk-node@0.300.0
原因は、2026年10月20日に公開された @opentelemetry/sdk-node 0.300.0 が @opentelemetry/api 1.10 を求め、@langfuse/otel 6.0.2 が依存する OpenTelemetry のパッケージ(@opentelemetry/core 2.x)は 1.10 未満を求めるためです。sdk-node だけを 0.223.0 に固定すると入りましたが、実行すると次のエラーになりました。
SyntaxError: Named export 'SeverityNumber' not found. The requested module '@opentelemetry/api' is a CommonJS module, which may not support all module.exports as named exports.
@langfuse/otel が引き込んだ @opentelemetry/exporter-trace-otlp-http が 0.300.0 になっていたためです。OpenTelemetry の JS パッケージの版をそろえて入れると動きました。
npm install @langfuse/tracing @langfuse/otel \
@opentelemetry/sdk-node@0.223.0 \
@opentelemetry/exporter-trace-otlp-http@0.223.0 \
@opentelemetry/otlp-exporter-base@0.223.0
この組み合わせで npm ls に invalid は0件でした。今後の版で直る可能性があるので、入れる前に npm と GitHub の Issue で最新の状況を確かめます。
届いたリクエスト
Python と違い、JS SDK は OTLP の JSON 形式(Content-Type: application/json、gzip)で送っていました。
POST /api/public/otel/v1/traces (934 bytes on wire, 3240 bytes JSON)
Authorization: Basic cGstbGYtMTIzNDpzay1sZi01Njc4
x-langfuse-sdk-name: javascript
x-langfuse-sdk-version: 6.0.2
x-langfuse-public-key: pk-lf-1234
x-langfuse-ingestion-version: 4
Content-Type: application/json
User-Agent: OTel-OTLP-Exporter-JavaScript/0.223.0
Content-Encoding: gzip
support-chat span 9.0 ms
call-llm generation 1.7 ms model=gpt-4o-mini usage_details={"input":40,"output":12}
propagateAttributes の userId・sessionId・tags は、Python と同じく user.id・session.id・langfuse.trace.tags として両方のスパンに入っていました。
OpenTelemetryで直接送る(Java・Goなど他の言語)
この節では、Langfuse の SDK が無い言語や、すでに OpenTelemetry を使っているアプリから送る方法が分かります。
Langfuse は OpenTelemetry のバックエンドとして、/api/public/otel で OTLP を受けます。公式ドキュメントの条件です。
| 項目 | 内容(公式ドキュメント) |
|---|---|
| 送り先 | https://cloud.langfuse.com/api/public/otel(トレースだけなら末尾に /v1/traces) |
| 形式 | OTLP over HTTP の JSON と protobuf。gRPC は未対応 |
| 認証 | Basic 認証(公開キー:秘密キー を base64) |
| 追加のヘッダー | x-langfuse-ingestion-version: 4。無いとデータの反映が最大10分遅れることがある |
| 受け取るもの | トレース(スパン)。gen_ai.* などの属性を Langfuse の項目に読み替える |
Python の OpenTelemetry SDK だけで(Langfuse の SDK を使わずに)送ってみました。
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
tp = TracerProvider(resource=Resource.create({"service.name": "faq-bot"}))
tp.add_span_processor(BatchSpanProcessor(OTLPSpanExporter())) # 送り先・ヘッダーは OTEL_* 環境変数
trace.set_tracer_provider(tp)
tracer = trace.get_tracer("faq-bot")
with tracer.start_as_current_span("handle-question") as root:
root.set_attribute("langfuse.user.id", "user-3003")
root.set_attribute("langfuse.session.id", "chat-20261023-03")
root.set_attribute("langfuse.trace.metadata.channel", "line")
with tracer.start_as_current_span("chat gpt-4o-mini") as llm:
llm.set_attribute("gen_ai.operation.name", "chat")
llm.set_attribute("gen_ai.request.model", "gpt-4o-mini")
llm.set_attribute("gen_ai.usage.input_tokens", 35)
llm.set_attribute("gen_ai.usage.output_tokens", 18)
tp.shutdown()
AUTH=$(printf '%s' 'pk-lf-1234:sk-lf-5678' | base64 -w0) # -w0 で改行させない
export OTEL_EXPORTER_OTLP_ENDPOINT="https://jp.cloud.langfuse.com/api/public/otel"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic ${AUTH},x-langfuse-ingestion-version=4"
python otel_app.py
擬似の受け口には POST /api/public/otel/v1/traces(protobuf、641バイト)が1回届き、Authorization と x-langfuse-ingestion-version: 4 のヘッダーが付いていました。SDK が /v1/traces を自動で足すので、OTEL_EXPORTER_OTLP_ENDPOINT には /api/public/otel までを書きます。
curl でも OTLP の JSON を送れます。Java・Go などの OpenTelemetry SDK も、同じ送り先とヘッダーで送れます。
curl -X POST https://jp.cloud.langfuse.com/api/public/otel/v1/traces \
-u 'pk-lf-...:sk-lf-...' \
-H 'Content-Type: application/json' -H 'x-langfuse-ingestion-version: 4' \
--data @span.json
OpenTelemetryの属性とLangfuseの項目の対応
公式ドキュメントの対応表から、よく使うものを抜き出しました。langfuse.* で始まる属性がいちばん優先されます。
| Langfuse の項目 | OpenTelemetry の属性 |
|---|---|
| userId | langfuse.user.id か user.id |
| sessionId | langfuse.session.id か session.id |
| tags | langfuse.trace.tags |
| トレースのメタデータ | langfuse.trace.metadata.* |
| 型 | langfuse.observation.type(span・generation など10種) |
| model | langfuse.observation.model.name・gen_ai.request.model・gen_ai.response.model |
| usage | langfuse.observation.usage_details・gen_ai.usage.* |
| cost | langfuse.observation.cost_details・gen_ai.usage.cost |
| input・output | langfuse.observation.input・gen_ai.prompt・gen_ai.completion など |
型を指定しなくても、モデル名の属性があれば generation として扱われます(明示した型がいつも優先)。ふつうの属性は metadata.attributes に入り、絞り込みに使えません。絞り込みたい値は langfuse.trace.metadata.* か langfuse.observation.metadata.* を付けて送ります。
OpenTelemetry の計装の基本は、関連記事「OpenTelemetry入門|Pythonで始めるトレース・メトリクス実装」で扱っています。
LangChain・Dify・Open WebUIとの連携
この節では、よく使うフレームワークやツールから Langfuse に送る方法が分かります。
LangChain(CallbackHandler)
LangChain は、Langfuse の CallbackHandler を callbacks に渡します。擬似の LLM で動かしました。
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langfuse.langchain import CallbackHandler
handler = CallbackHandler()
chain = (ChatPromptTemplate.from_messages([("system", "{product}のサポート担当です。"), ("user", "{question}")])
| ChatOpenAI(model="gpt-4o-mini", temperature=0) | StrOutputParser())
print(chain.invoke({"product": "RJC Shop", "question": "パスワードを忘れました"},
config={"callbacks": [handler], "metadata": {"langfuse_user_id": "user-4004"}}))
from langfuse import get_client; get_client().flush()
チェーンの各段がそのままオブザベーションになり、型も付いていました。metadata の langfuse_user_id は user.id として届きました。
RunnableSequence chain 20.9 ms
ChatPromptTemplate chain 0.9 ms
ChatOpenAI generation 14.2 ms model=gpt-4o-mini-2024-07-18 usage={"input": 52, "output": 21, "total": 73}
StrOutputParser chain 0.5 ms
OpenAI SDK を包んだとき(前の節)は使用量のキーが prompt_tokens・completion_tokens、LangChain では input・output でした。サーバーのソース(OtelIngestionProcessor.ts)には、prompt_tokens を入力のトークンとして読む処理があります。
そのほかの連携
公式の連携ページには、LangGraph・LlamaIndex・OpenAI Agents SDK・Vercel AI SDK・Pydantic AI・CrewAI・Spring AI・LiteLLM などが並んでいます。
| ツール | つなぎ方(公式ドキュメント) |
|---|---|
| Dify | 画面の「モニタリング」→「アプリパフォーマンスのトレース」で Langfuse を選び、シークレットキー・パブリックキー・ホストを入れる |
| Open WebUI | Pipelines の Langfuse フィルター(langfuse_v3_filter_pipeline.py)を追加し、キーを入れる |
| LiteLLM | LiteLLM の Langfuse 連携(OpenTelemetry)を有効にする |
| Claude Code | Stop フックで会話の記録を Langfuse に送る(プラグインあり) |
| n8n・Flowise・Langflow | 各ツールの Langfuse 連携の設定 |
Open WebUI の入れ方とつなぎ方は、関連記事「Open WebUIとは|インストール・使い方・Ollama接続とRAG設定」で扱っています。
コスト(トークン・料金)が計算される仕組み
この節では、Langfuse の画面に出る費用が、どこから来ているかと、出ないときの理由が分かります。
費用は、オブザベーションのモデル名とトークン数から、Langfuse のサーバーが計算します。 アプリから費用(cost_details)を送った場合はその値を使います。
サーバー v4.68.0 のソースにある既定のモデル定義(default-model-prices.json)は179件でした。モデル名は正規表現で照らし合わせます。手元で同じ正規表現を当てた結果です。
| 送ったモデル名 | 当たった定義 |
|---|---|
gpt-4o-mini |
gpt-4o-mini |
openai/gpt-4o-mini |
gpt-4o-mini |
GPT-4o-mini |
gpt-4o-mini(大文字小文字を区別しない) |
gpt-4o-mini-2024-07-18 |
gpt-4o-mini-2024-07-18(日付つきの定義が別にある) |
my-local-llama |
なし(費用は計算されない) |
gpt-4o-mini の定義の単価は、入力 0.00000015ドル/トークン、出力 0.0000006ドル/トークンでした。前の節の実行(入力52・出力21トークン)なら、52 × 0.00000015 + 21 × 0.0000006 = 0.0000204ドル です。
自分で動かしているモデル(Ollama・vLLM など)や、定義に無い名前は費用が空になります。その場合は画面のモデル設定で、名前の正規表現と単価を追加します。LLM の費用そのものを下げる方法は、関連記事「LLM APIのコスト削減方法|キャッシュとバッチの仕組みと計算例」で扱っています。
Langfuseのプロンプト管理の使い方(版・ラベル・キャッシュ)
この節では、プロンプトをコードから外して版で管理する方法と、SDK が実際にいつ取りに行くかが分かります。
公式ドキュメントでは、プロンプトは保存するたびに版(version)の番号が付き、ラベルで「どの版を本番で使うか」を決めます。get_prompt() でラベルを省くと production の版が返ります。
p1 = lf.get_prompt("support-answer", type="chat") # production の版
lf.get_prompt("support-answer", type="chat", label="staging") # ラベルで指定
lf.get_prompt("support-answer", type="chat", version=2) # 版の番号で指定
lf.get_prompt("support-answer", type="chat", cache_ttl_seconds=0) # キャッシュしない
print(p1.compile(product="RJC Shop", question="返品したい")) # {{変数}} を埋める
擬似の受け口に届いたリクエストと、実行の出力です。
=== GET /api/public/v2/prompts/support-answer
=== GET /api/public/v2/prompts/support-answer?label=staging
=== GET /api/public/v2/prompts/support-answer?version=2
=== GET /api/public/v2/prompts/support-answer
1回目 9.1 ms / 2回目 0.01 ms(キャッシュ)
version: 3 labels: ['production', 'latest'] config: {'model': 'gpt-4o-mini', 'temperature': 0.2}
[{'role': 'system', 'content': 'あなたはRJC Shopのサポート担当です。丁寧に短く答えます。'}, {'role': 'user', 'content': '返品したい'}]
同じプロンプトを2回取ると、2回目は通信せずにキャッシュから返りました(既定は60秒)。公式ドキュメントでは、期限が切れても手元のキャッシュをすぐ返し、裏で取り直します。Langfuse が止まっても、キャッシュがあればアプリは動き続けます。
起動直後でキャッシュが空のときに Langfuse につながらない場合に備えて、fallback を渡せます。存在しないプロンプトを指定して確かめました。
p = lf.get_prompt("missing-prompt", fallback="質問に答えてください:{{question}}")
print("fallback:", p.is_fallback, p.compile(question="テスト"))
Returning fallback prompt for 'missing-prompt-label:production' due to fetch error: ... status_code: 404, body: {'error': 'LangfuseNotFoundError', 'message': 'Prompt not found'}
fallback: True 質問に答えてください:テスト
config には、モデル名や temperature など、プロンプトと一緒に変えたい設定を入れておけます。プロンプトの版の管理の考え方は、関連記事「プロンプトの管理方法|バージョン管理と共有の管理表テンプレート」で扱っています。
Langfuseの評価・スコア・データセット(実験を実物で)
この節では、答えの品質を点数で記録する方法と、テストケースで変更前後を比べる「実験」の動きが分かります。
スコアの種類と付け方
スコアの型は SDK 5.0.4 で NUMERIC・BOOLEAN・CATEGORICAL・TEXT・CORRECTION の5つです。付け方は4通りあります。
| 付け方 | 内容 | 向いている場面 |
|---|---|---|
| SDK・API | コードで create_score()・score_current_trace() |
利用者の 👍👎、ルールで判定できる評価 |
| LLM-as-a-judge | 画面で評価用のプロンプトと LLM を設定し、自動で採点 | 正しさ・関連性など言葉の評価 |
| アノテーションキュー | 人が画面で順に見て採点 | 判断が難しいもの、評価用データ作り |
| 画面で直接 | トレースを開いて手で付ける | 気付いたものの記録 |
データセットで実験する(run_experiment)
手元のテストケース3件で、run_experiment() を実行しました。1件ずつの評価(期待する語が答えに入っているか)と、全体の評価(平均)を付けています。
from langfuse import get_client, Evaluation
lf = get_client()
data = [
{"input": "パスワードを忘れました", "expected_output": "設定"},
{"input": "返品の期限は?", "expected_output": "30日"},
{"input": "領収書はもらえますか", "expected_output": "マイページ"},
]
def task(*, item, **kwargs): # テストしたい処理(本当は LLM を呼ぶ)
answers = {"パスワードを忘れました": "「設定」から再設定できます",
"返品の期限は?": "到着から30日以内です",
"領収書はもらえますか": "注文履歴から発行できます"}
return answers[item["input"]]
def contains(*, input, output, expected_output, **kwargs): # 1件ずつの評価
return Evaluation(name="contains_expected", value=1.0 if expected_output in output else 0.0)
def avg(*, item_results, **kwargs): # 実行全体の評価
v = [e.value for r in item_results for e in r.evaluations]
return Evaluation(name="avg_contains", value=sum(v) / len(v))
result = lf.run_experiment(name="faq-bot-v2", data=data, task=task,
evaluators=[contains], run_evaluators=[avg])
print(result.format())
lf.flush()
🧪 Experiment: faq-bot-v2
📋 Run name: faq-bot-v2 - 2026-10-23T06:50:59.289986Z
3 items
Evaluations:
• contains_expected
Average Scores:
• contains_expected: 0.667
Run Evaluations:
• avg_contains: 0.667
送られたのは、トレース3件(1件ごとに experiment-item-run→experiment-item-task・experiment-item-evaluation→contains〈型は evaluator〉の4つのオブザベーション)と、スコア4件(1件ずつの3件と、実行全体の avg_contains 1件)でした。units で数えると 3+12+4=19 です。評価で作られたトレースとスコアも units に数えられることが、公式の課金単位の説明に書かれています。
画面に保存したデータセットを使うときは lf.get_dataset("名前") で取り出し、同じ形で実行します。プルリクエストで実験を走らせて、点数が下がったら止める GitHub Action(langfuse/experiment-action)も公式にあります。評価の指標とテストケースの作り方は、関連記事「LLMの評価方法と評価指標一覧|テストケース表のテンプレート付き」で扱っています。
個人情報のマスキングとサンプリング
この節では、送りたくない値を消す方法と、送る量を減らす方法を、実際に効いたかどうかで確かめられます。
マスキング(mask)
Langfuse(mask=関数) を渡すと、入力・出力・メタデータを送る前にその関数を通します。メールアドレスを [EMAIL] にする関数を、文字列だけを置き換える形で書いたところ、出力は消えたのに入力はそのまま送られました。
langfuse.observation.input = {"args": ["taro@example.com"], "kwargs": {}}
langfuse.observation.output = [EMAIL] 宛てに再設定メールを送りました
関数に届く値を表示すると、@observe の入力は {'args': ('taro@example.com',), 'kwargs': {}} という辞書で、引数はタプルでした。辞書・リスト・タプルの中までたどる形にすると、入力も消えました。
import re
from langfuse import Langfuse, observe
EMAIL = re.compile(r"[\w.+-]+@[\w-]+\.[\w.]+")
def mask(*, data, **kwargs): # dict・tuple(@observe の引数)も中までたどる
if isinstance(data, str): return EMAIL.sub("[EMAIL]", data)
if isinstance(data, dict): return {k: mask(data=v) for k, v in data.items()}
if isinstance(data, (list, tuple)): return [mask(data=v) for v in data]
return data
lf = Langfuse(mask=mask)
langfuse.observation.input = {"args": ["[EMAIL]"], "kwargs": {}}
langfuse.observation.output = [EMAIL] 宛てに再設定メールを送りました
引数を一切送りたくない関数は、@observe(capture_input=False, capture_output=False) で記録を止められます。
サンプリング(LANGFUSE_SAMPLE_RATE)
@observe の関数を200回呼ぶスクリプトで、送られたトレースの数を数えました。
| LANGFUSE_SAMPLE_RATE | 送られたトレース |
|---|---|
| 未設定(1.0) | 200件 |
| 0.25 | 52件 |
サンプリングはトレース単位なので、送られたトレースの中のオブザベーションは欠けません。量が多いアプリで units を減らす方法の1つです。
Langfuseの料金(Cloudのプランとunits)
この節では、Langfuse Cloud の料金がどう決まり、自分の使い方でいくらになるかが分かります。
Langfuse Cloud の料金は、プランの月額と、取り込んだ units の数で決まります。 公式の説明では、units は「トレースの件数+オブザベーションの件数+スコアの件数」です。利用者の人数では課金されません(Core 以上は人数無制限)。
料金ページの内容です(米ドル、1か月あたり。2026年10月23日時点)。
| 項目 | Hobby | Core | Pro | Enterprise |
|---|---|---|---|---|
| 月額 | 無料 | 29ドル | 199ドル | 2,499ドル |
| 含まれる units | 5万 | 10万 | 10万 | 10万 |
| 超えた分 | 使えない | 下の段階料金 | 下の段階料金 | 下の段階料金 |
| データを見られる期間 | 30日 | 90日 | 3年 | 3年 |
| ユーザー | 2人 | 無制限 | 無制限 | 無制限 |
| 超えた units | 10万 units あたり |
|---|---|
| 10万〜100万 | 8ドル |
| 100万〜1,000万 | 7ドル |
| 1,000万〜5,000万 | 6.5ドル |
| 5,000万〜 | 6ドル |
API の上限(1分あたりのリクエスト。一般/取り込み)は、Hobby が30/1,000、Core が100/4,000、Pro が1,000/20,000、Enterprise は個別です。Pro には SSO・細かい権限などを足す Teams アドオン(月300ドル)があります。割引は、創業期のスタートアップが初年度50%、研究・学生が最大100%、非営利団体が月199ドル分、オープンソースのプロジェクトが初年度月300ドル分のクレジットです。
月額の試算
前の節の Python の例(1回のチャットで 7 units)を、1日の件数を変えて計算しました。
| 1日のチャット | 月の units(30日) | Core | Pro |
|---|---|---|---|
| 1,000回 | 21万 | 37.8ドル | 207.8ドル |
| 1万回 | 210万 | 178ドル | 348ドル |
| 10万回 | 2,100万 | 1,446ドル | 1,616ドル |
1日1,000回でも月21万 units になり、Hobby(5万)には入りません。1回のチャットで LLM を何度も呼ぶエージェントは、オブザベーションが増えるぶん units も増えます。units を減らすには、サンプリング、記録しなくてよい細かいスパンを減らす、の2つが効きます。
セルフホストの料金
セルフホストの OSS 版は MIT ライセンスで無料で、units の課金はありません。料金ページでは、観測・評価・プロンプト管理・データセットなどの中心の機能と API、Enterprise SSO と組織単位の権限(RBAC)が OSS 版に入っています。プロジェクト単位の権限・データ保持のポリシー・監査ログなどは Enterprise 版(個別見積もり)です。サーバー代・保存の費用・運用の手間は自分で持ちます。
Langfuseのセルフホスト(Docker Composeの手順と必要な環境)
この節では、Langfuse を自分のサーバーで動かすときの構成・手順・必要な版が分かります。
構成(6つのコンテナ)
GitHub の docker-compose.yml(v4.68.0)にあるサービスです。
| サービス | 役割 | イメージ |
|---|---|---|
| langfuse-web | 画面と API(ポート3000) | langfuse/langfuse:4 |
| langfuse-worker | 受け取ったデータを裏で処理 | langfuse/langfuse-worker:4 |
| postgres | ユーザー・プロジェクト・プロンプトなど | postgres:17(既定) |
| clickhouse | トレース・オブザベーション・スコア | clickhouse-server:25.12 |
| redis | キャッシュとジョブのキュー | redis:7 |
| minio | S3 互換の保存先(イベント・添付) | chainguard/minio(ホストの9090番) |
Langfuse Cloud
サーバーの運用・更新・バックアップが要らない
units の量で費用が増える
データは選んだリージョン(日本もある)に置かれる
セルフホスト
OSS 版は無料。データを社内に置ける
ClickHouse などの運用・保存の増加・版の更新を自分で受け持つ
Docker Compose は高可用性・拡張・バックアップなし
必要な環境と版(v4)
| 項目 | 公式ドキュメントの値 |
|---|---|
| 試すための VM | 4コア・16GiB メモリ以上、保存は約100GiB(AWS なら t3.xlarge) |
| 本番のコンテナ | すべて 2CPU・4GB 以上。web は2台以上で冗長化 |
| PostgreSQL | v4 は15以上(16を推奨) |
| ClickHouse | v4 は25.12以上(26.4を推奨) |
| Redis・Valkey | Redis 7以上(7.2を推奨)、Valkey 8以上。maxmemory-policy=noeviction が必須 |
| 保存先 | S3 互換(本番は S3・GCS・Azure Blob・R2 などのマネージドを推奨) |
| 本番の置き方 | Kubernetes(Helm)、AWS・Azure・GCP のテンプレート |
Docker Compose で起動する手順
公式ドキュメントの手順です。
git clone https://github.com/langfuse/langfuse.git
cd langfuse
# docker-compose.yml の「# CHANGEME」の値を長いランダムな値に変える
docker compose up
# langfuse-web-1 のログに「Ready」が出たら http://localhost:3000 を開く(2〜3分)
最初はログインの利用者がいないので、画面の Sign up で作ります。LANGFUSE_INIT_* の環境変数で、組織・プロジェクト・API キー・利用者を起動時に作ることもできます。
docker-compose.yml で # CHANGEME が付いている値は11個でした。既定のまま公開すると、だれでも推測できるパスワードで動くことになります。
SALT ENCRYPTION_KEY NEXTAUTH_SECRET DATABASE_URL POSTGRES_PASSWORD
CLICKHOUSE_PASSWORD REDIS_AUTH MINIO_ROOT_PASSWORD
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY
LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY
ENCRYPTION_KEY は、ファイル内のコメントにあるとおり openssl rand -hex 32 で作る64文字の16進数です。
openssl rand -hex 32
そのほかの注意(公式ドキュメント)です。
- ホストに公開するのは langfuse-web(3000)と minio(9090)だけで、ほかは 127.0.0.1 に限られています。VM ではこの2つ以外への通信を止めます。
- ポートを変えたら、
NEXTAUTH_URLとLANGFUSE_S3_MEDIA_UPLOAD_ENDPOINTも合わせます。 - Docker の json-file のログはそのままでは回らないので、
max-size・max-fileを設定します。 - 更新は止めてから
docker compose up --pull always。docker compose down -vはデータも消えます。
LangSmith・Arize Phoenix・New Relicとの違い
この節では、よく比べられる製品との違いを、各社の公式の情報で比べられます。
| 比べる点 | Langfuse | LangSmith | Arize Phoenix |
|---|---|---|---|
| 提供元 | Langfuse(ClickHouse) | LangChain | Arize AI |
| ライセンス・形態 | MIT(一部 ee/ を除く) | SaaS(Cloud・Hybrid・Self-Hosted) | Elastic License 2.0 |
| セルフホスト | 無料の OSS 版あり | Enterprise のみ | 無料で可 |
| 無料枠(SaaS) | 月5万 units・2人 | 月5千 base traces・1人 | ― |
| 有料の入口 | Core 月29ドル(人数無制限) | Plus 1人月39ドル(1万 base traces) | ― |
| 保存期間 | 30日・90日・3年(プラン別) | base 14日・extended 180日 | ― |
LangSmith の情報は langchain.com の料金ページ、Phoenix は arize.com のドキュメント(2026年10月23日時点)です。LangSmith は LangChain・LangGraph と同じ会社の製品です。Langfuse は特定のフレームワークに寄らず、OpenTelemetry と多くの連携を持ちます。
| 比べる点 | Langfuse | New Relic などの APM |
|---|---|---|
| 主に見るもの | LLM の入力・出力・トークン・費用・品質のスコア | 処理時間・エラー・インフラ・ログ |
| 評価・プロンプト管理 | ある | 主な機能ではない |
| 料金の単位 | units(件数) | データ量・ユーザー数など製品ごと |
| 一緒に使う形 | OpenTelemetry で同じスパンを両方に送る形もある | 同じ |
New Relic の仕組みと料金は関連記事「New Relicとは|できること・料金・NRQLと仕組みを実例で解説」で扱っています。
Langfuseのよくあるエラーと、データが出ないとき
この節では、トレースが出ない・エラーが出るときの原因と直し方を引けます。エラー文は、この記事で実際に出たもの(Python SDK 5.0.4・npm)です。401 の本文は、サーバーのソース(apiAuth.ts)の文言を擬似の受け口で返したものです。
| エラー・症状 | 原因 | 直し方 |
|---|---|---|
Authentication error: Langfuse client initialized without public_key. Client will be disabled. |
LANGFUSE_PUBLIC_KEY が読めていない |
環境変数の名前と、読み込むタイミング(.env の読み込み前に get_client() していないか)を確かめる |
Failed to export spans batch code: 401, reason: Unauthorized |
キーが違う、またはリージョンが違う | キーを作ったプロジェクトのリージョンと LANGFUSE_BASE_URL を合わせる(未設定だと EU に送る) |
UnauthorizedError: ... status_code: 401, body: {'message': "Invalid credentials. Confirm that you've configured the correct host."} |
auth_check() やプロンプト取得で認証に失敗 |
同上。公開キーと秘密キーの取り違えも確かめる |
Transient error ... encountered while exporting spans batch, retrying in 1.17s. のあと Failed to export spans batch due to timeout, max retries or shutdown. |
送り先につながらない(URL・ポート・プロキシ・ファイアウォール) | LANGFUSE_BASE_URL に curl でつながるか確かめる。セルフホストは 3000番 |
NotFoundError: ... 'message': 'Prompt not found' |
プロンプトの名前、または production ラベルの版が無い |
名前とラベルを確かめる。fallback= を渡す |
npm error code ERESOLVE / Named export 'SeverityNumber' not found |
OpenTelemetry の JS パッケージの版が混ざった | 上の節のとおり OpenTelemetry のパッケージの版をそろえる |
| 費用が空のまま | モデル名が既定のモデル定義に当たらない | 画面でモデル定義(正規表現と単価)を追加する |
| メールアドレスなどが入力に残る | mask の関数がタプルや辞書の中を見ていない |
上の節のように中までたどる |
| OpenTelemetry のデータが遅れて出る | x-langfuse-ingestion-version: 4 が無い |
ヘッダーに足す(無いと最大10分遅れることがある) |
| gRPC で送れない | Langfuse は OTLP の gRPC に未対応 | OTLP/HTTP(JSON か protobuf)にする |
| セルフホストで SDK v5 が動かない | サーバーが v3、または v4.59.0 未満 | サーバーを上げるか、Python SDK v4・JS SDK v5 を使う |
- 1リージョンは合っているか日本で作ったなら jp.cloud.langfuse.com。未設定は EU
- 2短い処理で flush しているかPython は flush()、JS は sdk.shutdown()
- 3auth_check() が True になるか開発中だけ使う。本番の起動のたびに呼ばない
- 4SDK とサーバーの版の組み合わせは合っているかSDK v5・v6 はサーバー v4 が必要
- 5環境(environment)の絞り込みが合っているか画面で別の環境を見ていると出ていないように見える
auth_check() は、正しいキーでは True、キーが無いときは Auth check failed: Client not properly initialized. のあと False を返しました。SDK のソースの説明には「処理を止める(blocking)ので本番のコードでは勧めない」とあり、公式のトラブルシューティングも設定の確認のとき(本番以外)に使う形を示しています。
Langfuseが合う・合わないの判断表
この節では、状況ごとに Langfuse を選ぶかどうかの目安が分かります。
| 状況 | 選ぶものの目安 |
|---|---|
| LLM アプリの中身(入力・出力・トークン・費用)を見たい | Langfuse など LLM 向けの観測ツール |
| データを社外に出せない | Langfuse のセルフホスト(OSS 版は無料) |
| データを日本に置きたいが運用はしたくない | Langfuse Cloud の日本リージョン |
| 見る人が多い(企画・品質の担当も見る) | 人数で課金されない Langfuse Cloud の Core 以上 |
| LangChain・LangGraph だけで作っていて、同じ会社の製品でそろえたい | LangSmith |
| 処理時間・エラー・インフラ全体を見たい | New Relic などの APM(Langfuse と併用もできる) |
| まず小さく試したい | Hobby(月5万 units)か、手元の Docker Compose |
よくある質問
Q. Langfuseの読み方は? A. 日本語では「ラングフューズ」と書かれることが多い名前です。表記は Langfuse です。
Q. Langfuseとは何ですか? A. LLM アプリの呼び出しの流れ・入力と出力・トークン数・費用を記録し、評価のスコアやプロンプトの版と結び付けて調べるオープンソースのツールです。機能は「Langfuseでできること」の節にあります。
Q. Langfuseは無料で使えますか? A. 使えます。Cloud の Hobby は月5万 units・2人まで無料で、クレジットカードは要りません。セルフホストの OSS 版は MIT ライセンスで無料です(2026年10月23日時点)。
Q. Langfuseの料金はいくらですか? A. Cloud は Core が月29ドル、Pro が月199ドル、Enterprise が月2,499ドルで、10万 units を超えた分は10万 units あたり8ドルからです(2026年10月23日時点)。試算は「月額の試算」にあります。
Q. unitsとは何ですか? A. トレース・オブザベーション・スコアの件数の合計です。この記事の Python の例では、1回のチャットで 7 units(トレース1・オブザベーション5・スコア1)でした。
Q. Langfuseに日本リージョンはありますか?
A. あります。https://jp.cloud.langfuse.com で、Hobby を含む全プランで選べます。
Q. LangfuseとLangSmithの違いは? A. Langfuse は MIT ライセンスで無料のセルフホストがあり、利用者の人数で課金しません。LangSmith は LangChain の製品で、セルフホストは Enterprise、有料プランは1人月39ドルです。表は「LangSmith・Arize Phoenix・New Relicとの違い」にあります。
Q. LangfuseはDockerで動かせますか?
A. 動かせます。GitHub のリポジトリを clone し、# CHANGEME の値を変えて docker compose up です。web・worker・PostgreSQL・ClickHouse・Redis・MinIO の6つのコンテナが起動します。本番は Kubernetes(Helm)が案内されています。
Q. LangfuseはOpenTelemetryで使えますか?
A. 使えます。/api/public/otel に OTLP/HTTP(JSON か protobuf)で、Basic 認証と x-langfuse-ingestion-version: 4 のヘッダーを付けて送ります。Python・JS の SDK も中身は OpenTelemetry です。
Q. LangfuseはDifyと連携できますか? A. できます。Dify の「モニタリング」→「アプリパフォーマンスのトレース」で Langfuse を選び、シークレットキー・パブリックキー・ホストを入れます。
Q. Langfuseの画面は日本語に対応していますか? A. 画面は英語です。公式サイトには日本語の学習用ページ(Academy の日本語版)があります。
Q. Python SDKはどのPythonで動きますか? A. 2026年10月23日時点の Python SDK v5 は Python 3.11 以上です。JS/TS SDK v6 は Node.js 22 以上です。
まとめ
- Langfuse は、LLM アプリのトレース・トークンと費用・評価・プロンプト管理・データセットを1つにまとめた、MIT ライセンスのオープンソースの観測ツール。2026年1月に ClickHouse が買収。
- データの単位はオブザベーション(10種の型)。同じ
trace_idの集まりがトレース、会話のまとまりがセッション。v4 ではオブザベーションの表1つで持つ。 - Python SDK v5 は OTLP の protobuf、JS SDK v6 は OTLP の JSON で
/api/public/otel/v1/tracesに送り、スコアは/api/public/scoresに別に送る(実測)。 - 費用はモデル名とトークン数からサーバーが計算する。既定のモデル定義に当たらない名前は費用が空になる。
- Cloud は units(トレース+オブザベーション+スコア)で課金。Hobby は月5万 units 無料、Core は月29ドル。日本リージョンがある(2026年10月23日時点)。
- セルフホストは6つのコンテナ。v4 は PostgreSQL 15以上・ClickHouse 25.12以上・Redis 7以上。
# CHANGEMEの11個の値を必ず変える。 maskはタプル・辞書の中までたどる、JS は OpenTelemetry のパッケージの版をそろえる、が実際につまずいた点。
参考・出典
確認日はいずれも 2026年10月23日です。
- Langfuse「Pricing」:https://langfuse.com/pricing
- Langfuse「Self-Hosted Pricing」:https://langfuse.com/pricing-self-host
- Langfuse Docs「Billable Units」:https://langfuse.com/docs/administration/billable-units
- Langfuse Docs「Observability Overview」:https://langfuse.com/docs/observability/overview
- Langfuse Docs「Data Model」:https://langfuse.com/docs/observability/data-model
- Langfuse Docs「Observation Types」:https://langfuse.com/docs/observability/features/observation-types
- Langfuse Docs「Langfuse v4 is live」:https://langfuse.com/docs/v4
- Langfuse Docs「Versions & Compatibility」:https://langfuse.com/docs/compatibility
- Langfuse Docs「SDK Overview」:https://langfuse.com/docs/observability/sdk/overview
- Langfuse Docs「OpenTelemetry」:https://langfuse.com/integrations/native/opentelemetry
- Langfuse Docs「LangChain」:https://langfuse.com/integrations/frameworks/langchain
- Langfuse Docs「OpenWebUI」:https://langfuse.com/integrations/no-code/openwebui
- Langfuse Docs「Claude Code」:https://langfuse.com/integrations/developer-tools/claude-code
- Langfuse Docs「Prompt Version Control」:https://langfuse.com/docs/prompt-management/features/prompt-version-control
- Langfuse Docs「Prompt Caching」:https://langfuse.com/docs/prompt-management/features/caching
- Langfuse Docs「Evaluation Overview」:https://langfuse.com/docs/evaluation/overview
- Langfuse Docs「Self-hosting」:https://langfuse.com/self-hosting
- Langfuse Docs「Docker Compose」:https://langfuse.com/self-hosting/deployment/docker-compose
- Langfuse Docs「Containers」「Postgres」「ClickHouse」「Cache」:https://langfuse.com/self-hosting/deployment/infrastructure/containers
- Langfuse Blog「Langfuse joins ClickHouse」(2026年1月16日):https://langfuse.com/blog/joining-clickhouse
- Langfuse「Langfuse vs. LangSmith」:https://langfuse.com/compare/langsmith
- GitHub「langfuse/langfuse」(LICENSE・docker-compose.yml・default-model-prices.json、v4.68.0):https://github.com/langfuse/langfuse
- Langfuse Python SDK(PyPI):https://pypi.org/project/langfuse/
- Langfuse JS/TS SDK(npm):https://www.npmjs.com/package/@langfuse/tracing
- Dify ドキュメント「Langfuse」:https://docs.dify.ai/ja/cloud/use-dify/monitor/integrations/integrate-langfuse
- LangChain「LangSmith Pricing」:https://www.langchain.com/pricing
- LangChain Docs「Usage and billing」:https://docs.langchain.com/langsmith/usage-and-billing
- Arize「Phoenix License」:https://www.arize.com/docs/phoenix/self-hosting/license
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Langfuseとは|使い方・料金・セルフホストとSDKの送信を実例で解説」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。