LLM可观测性服务器

Langfuse MCP Server是一个用于LLM应用的全栈可观测性和分析工具,提供跟踪查询、准确性分析、故障检测、成本跟踪、延迟调试、提示和数据集管理等功能。

  • by DrishtantKaushal
  • Python
  • 混合部署
  • 2 星标
  • 更新于
在 GitHub 查看 DrishtantKaushal/langfuse-mcp

使用说明

Langfuse MCP服务器

模型上下文协议 服务器 浪焰 可观察性。查询跟踪、分析准确性、检测故障、跟踪成本、调试延迟、管理提示和数据集。

56工具 跨数据访问和分析。多项目支持,因此一个实例可以服务于多个Langfuse项目。适用于 克劳德代码, Codex CLI, 光标,以及任何兼容MCP的客户端。

为什么选择MCP服务器?

对比 廊坊MCP官方 (截至2026年3月):

能力 此服务器 Langfuse MCP官方
痕迹和观察 是 否
会话和用户 是 否
异常跟踪 是 否
提示管理 是 是
数据集管理 是 否
注释队列 是 否
分数v2 API 是 否
分数回写 是 否
多项目支持 是 否
准确性指标 是 否
故障检测 是 否
令牌百分比 是 否
成本细分 是 否
延时分析 是 否
会话分析 是 否
上下文泄露扫描 是 否
用户组聚合 是 否

官方MCP专注于快速管理。此服务器提供 完整的可观察性和分析工具包 --跟踪、观察、会话、分数、异常、提示、数据集、注释队列,以及9个内置分析工具,这些工具在服务器端计算洞察并返回LLM大小的摘要。多项目路由允许单个实例在一个连接器URL后面为多个Langfuse项目提供服务。


快速开始

1.获取API密钥

  • 廊坊云: cloud.langfuse.com → 设置→ API密钥
  • 自托管: 您的Langfuse实例→ 设置→ API密钥。集 LANGFUSE_HOST 到您的实例URL(例如。, https://langfuse.yourcompany.com)

2.添加MCP服务器

克劳德代码

claude mcp add \
  -e LANGFUSE_PUBLIC_KEY=pk-lf-... \
  -e LANGFUSE_SECRET_KEY=sk-lf-... \
  -e LANGFUSE_HOST=https://cloud.langfuse.com \
  --scope project \
  langfuse-mcp -- uvx langfuse-mcp-server

Codex CLI

codex mcp add langfuse-mcp \
  --env LANGFUSE_PUBLIC_KEY=pk-lf-... \
  --env LANGFUSE_SECRET_KEY=sk-lf-... \
  --env LANGFUSE_HOST=https://cloud.langfuse.com \
  -- uvx langfuse-mcp-server

光标

添加 .cursor/mcp.json:

{
  "mcpServers": {
    "langfuse-mcp": {
      "command": "uvx",
      "args": ["langfuse-mcp-server"],
      "env": {
        "LANGFUSE_PUBLIC_KEY": "pk-lf-...",
        "LANGFUSE_SECRET_KEY": "sk-lf-...",
        "LANGFUSE_HOST": "https://cloud.langfuse.com"
      }
    }
  }
}

3.验证

重新启动CLI,然后使用进行测试 /mcp (克劳德代码)或 codex mcp list (食品法典委员会)。

手动安装(uvx的替代品)

pip install langfuse-mcp-server
langfuse-mcp-server

作为远程服务托管

作为长期HTTP服务运行,以便多个用户连接到单个实例——这是 Claude.ai定制连接器,并且可用于在不向每个用户分发Langfuse API密钥的情况下进行团队访问。

通过env变量启用;没有代码更改。

最低设置

MCP_TRANSPORT=streamable-http
MCP_BASE_URL=https://mcp.yourcompany.com
LANGFUSE_PUBLIC_KEY=pk-lf-...
LANGFUSE_SECRET_KEY=sk-lf-...
LANGFUSE_HOST=https://your-langfuse-instance.example

如果没有OAuth环境变量,端点将无法通过身份验证,仅适用于本地测试。请参阅下面的Google OAuth设置以获取生产信息。

码头工人

生产准备就绪 Dockerfile 被签入仓库(非root用户、固定基座、非root用户), .dockerignore 以防止秘密泄露)。每个标记的版本都会通过以下方式自动将多拱形映像发布到GitHub容器注册表 .github/workflows/docker-publish.yml.

拉取已发布的图像:

docker pull ghcr.io/drishtantkaushal/langfusemcp:latest

或者从源代码构建:

docker build -t langfuse-mcp .

运行(所有秘密通过注入 -e,从未融入图像中):

docker run -d \
  --name langfuse-mcp \
  --restart unless-stopped \
  -p 8000:8000 \
  -e MCP_TRANSPORT=streamable-http \
  -e MCP_BASE_URL=https://mcp.yourcompany.com \
  -e LANGFUSE_PUBLIC_KEY=pk-lf-... \
  -e LANGFUSE_SECRET_KEY=sk-lf-... \
  -e LANGFUSE_HOST=https://cloud.langfuse.com \
  -e GOOGLE_CLIENT_ID=... \
  -e GOOGLE_CLIENT_SECRET=... \
  -e ALLOWED_EMAIL_DOMAINS=yourcompany.com \
  ghcr.io/drishtantkaushal/langfusemcp:latest

反向代理

在前面终止TLS(nginx、Caddy、Cloudflare)。MCP端点位于 /mcp/ (尾随斜线)。由于响应流,代理必须:

  • 禁用响应缓冲 --nginx: proxy_buffering off;
  • 允许读取超时≥5分钟 --一些分析查询可以合法地运行几分钟
  • 使用keepalive上游讲HTTP/1.1

谷歌OAuth

在您的Google Cloud项目中:

  1. API和服务→ OAuth 同意屏幕
    • 用户类型: 内部 (限制登录您的Google Workspace域)
    • 范围: openid, https://www.googleapis.com/auth/userinfo.email
  2. 凭证→ 创建OAuth客户端ID→ 网络应用程序
    • 授权重定向URI: https://{your-base-url}/auth/callback
    • 复制客户端ID和客户端密码

设置:

GOOGLE_CLIENT_ID=....apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-...

OAuth在以下情况下激活 GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET,以及 MCP_BASE_URL 都准备好了。通过内部同意屏幕,谷歌在身份层拒绝非工作区登录——服务器永远不会看到这些尝试。

可选电子邮件列表

对于比“工作区中的任何人”更窄的控制:

# either, or both
ALLOWED_EMAIL_DOMAINS=yourcompany.com
ALLOWED_EMAILS=alice@yourcompany.com,bob@yourcompany.com

设置后,每次工具调用都会验证调用者的 email_verified 在继续之前,要求并检查会员资格。当未设置时,服务器信任OAuth提供者返回的任何内容。

添加到Claude.ai

一旦托管在 https://mcp.yourcompany.com:

  1. Claude.ai→ 设置→ 连接器→ 添加自定义连接器
  2. 远程MCP服务器URL: https://mcp.yourcompany.com/mcp/
  3. 将OAuth客户端ID/密钥字段留空 --服务器使用动态客户端注册;这些字段用于不同的部署模式。
  4. 点击添加→ 谷歌登录弹出窗口→ done.

验证部署

已启用身份验证,预计401:

curl -i -X POST https://mcp.yourcompany.com/mcp/ \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

OAuth元数据端点返回JSON(Claude.ai用于自动注册):

curl https://mcp.yourcompany.com/.well-known/oauth-authorization-server

活体/准备状态探测——未经验证 GET /health 返回HTTP 200 {"status": "ok"},适用于Kubernetes探测器:

curl -i https://mcp.yourcompany.com/health

多项目支持

单个服务器实例可以路由到多个Langfuse项目。每个工具都接受一个可选 project 论证;如果省略,则使用服务器配置的默认值。呼叫 list_projects 以发现可用的内容。

配置工程

通过索引的env变量声明每个项目。项目名称是数据,而不是变量名称的一部分——使用您喜欢的任何方案。

LANGFUSE_PROJECT_1_NAME=production
LANGFUSE_PROJECT_1_PUBLIC_KEY=pk-lf-...
LANGFUSE_PROJECT_1_SECRET_KEY=sk-lf-...
LANGFUSE_PROJECT_1_HOST=https://cloud.langfuse.com

LANGFUSE_PROJECT_2_NAME=staging
LANGFUSE_PROJECT_2_PUBLIC_KEY=pk-lf-...
LANGFUSE_PROJECT_2_SECRET_KEY=sk-lf-...
LANGFUSE_PROJECT_2_HOST=https://cloud.langfuse.com

LANGFUSE_DEFAULT_PROJECT=production

客户端使用

Claude: "Show me failing traces in production today."
→ fetch_traces(project="production", ...) routed to project 1's credentials.

Claude: "Compare that with staging."
→ fetch_traces(project="staging", ...) routed to project 2's credentials.

每个项目都有自己的缓存、速率限制器和连接池。Claude.ai看到一个连接器;用户通过OAuth进行一次身份验证,可以查询会话中任何配置的项目。

单项目(遗留)模式

如果 LANGFUSE_PROJECT_1_NAME 如果未设置,服务器将回退到旧版 LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY / LANGFUSE_HOST var并将其注册为一个名为 default。现有部署保持不变。


配置

环境变量 默认值 描述
LANGFUSE_PUBLIC_KEY (必填) 廊坊API公用密钥
LANGFUSE_SECRET_KEY (必填) 廊坊API密钥
LANGFUSE_HOST https://cloud.langfuse.com Langfuse实例URL(云或自托管)
LANGFUSE_INTERNAL_DOMAINS "" 逗号分隔的内部域以排除在分析之外(例如。, mycompany.com,test.com).使用时适用 group_by='domain'.
LANGFUSE_MCP_READ_ONLY false 禁用写入操作(score_traces, create_dataset等等)
LANGFUSE_PAGE_LIMIT 100 每个API页面的痕迹
LANGFUSE_PROJECT_{N}_NAME (未设置) 多项目:项目N的名称(例如。 production).看 多项目.
LANGFUSE_PROJECT_{N}_PUBLIC_KEY (未设置) 项目N的公钥
LANGFUSE_PROJECT_{N}_SECRET_KEY (未设置) 项目N的密钥
LANGFUSE_PROJECT_{N}_HOST https://cloud.langfuse.com 项目N的主机URL
LANGFUSE_DEFAULT_PROJECT 首次配置 工具调用省略时使用的默认项目名称 project.
MCP_TRANSPORT stdio stdio 或 streamable-httpHTTP模式监听端口,而不是stdin/stdout。看 托管.
MCP_HOST 0.0.0.0 绑定地址时 MCP_TRANSPORT=streamable-http.
MCP_PORT 8000 港口何时 MCP_TRANSPORT=streamable-http.
MCP_BASE_URL (未设置) 托管服务器的公共基础URL。这是Google OAuth所必需的。
GOOGLE_CLIENT_ID (未设置) Google OAuth客户端ID。当设置了所有三个Google变量时,OAuth会激活。
GOOGLE_CLIENT_SECRET (未设置) Google OAuth客户端机密。
ALLOWED_EMAILS (未设置) 逗号分隔的电子邮件允许调用工具。需要OAuth。
ALLOWED_EMAIL_DOMAINS (未设置) 逗号分隔的电子邮件域允许调用工具。需要OAuth。

工具

分析(9个工具)

计算服务器端见解并返回简洁摘要的工具。这些超出了原始数据访问的范围——它们聚合、检测模式和计算统计数据,因此LLM可以在不达到上下文窗口限制的情况下对结果进行推理。

工具 说明 关键参数
aggregate_by_group 按用户组聚合跟踪指标。每组返回:跟踪计数、唯一会话、唯一用户、准确率、平均延迟、总成本。 group_by (名称/用户ID/域/标签), time_range, top_n, exclude_internal
compute_accuracy 根据反馈分数计算准确性。准确度=正确/(正确+不正确)。支持趋势分析的分组和时间分段。 group_by, bucket_by (周/天), score_name, time_range
detect_failures 使用模式匹配(“无法”、“我不能”等)和负反馈分数检测LLM输出质量故障。非Python异常——使用 find_exceptions 对于那些。 group_by, include_examples, max_examples, time_range
compute_token_percentiles 计算跟踪级别的令牌使用百分比(TP50/TP90/TP95/TP99)。获取生成观测值,以获得准确的每跟踪令牌计数。 group_by, percentiles, time_range
detect_context_breaches 扫描任何一代超过令牌阈值的痕迹。捕获导致LLM性能下降或静默截断的上下文窗口溢出。 threshold (默认256000), check_per_generation, time_range
analyze_sessions 分析多回合会话行为。返回会话计数、深度分布(单圈与多圈)、参与度指标和会话级成本/延迟。 group_by, time_range
estimate_costs 使用Langfuse的内置计算成本明细 totalCost 字段(模型感知,由Langfuse计算)。按用户、代理或时间段分组。 group_by, bucket_by (周/天), time_range
analyze_latency 分析跟踪级别的延迟分布,并可选地分析每一代LLM的延迟分布。确定哪个模型是瓶颈。 group_by, percentiles, include_per_generation, time_range
score_traces 将分数写回Langfuse。使用分析后的结果来注释跟踪——标记失败以供审查,标记高质量的跟踪以创建数据集。 trace_ids, score_name, score_value, comment

数据访问(25个工具)

完整的Langfuse API覆盖范围,用于查询和管理您的可观测性数据。

痕迹

工具 说明
fetch_traces 列出带有过滤器的跟踪--用户ID、名称、标签、时间范围、顺序。返回分页结果。
fetch_trace 按ID获取单个跟踪,包括所有观察结果(跨度、世代、事件)的完整详细信息。
diff_traces 并排比较两个跟踪(名称、用户、延迟、成本、标签、发布、版本)。

观察

工具 说明
fetch_observations 使用过滤器列出观察结果——跟踪ID、类型(GENERATION/SPAN/EVENT)、名称、时间范围。
fetch_observation 按ID获取单个观察值。返回输入/输出、令牌使用情况、模型、延迟和成本。

会话

工具 说明
fetch_sessions 列出具有可选时间过滤器的会话。
get_session_details 获取会话的完整细节,包括其所有痕迹。
get_user_sessions 获取特定用户的会话。获取用户的痕迹并提取独特的会话。

错误

工具 说明
find_exceptions 查找具有错误状态的观察结果。对于LLM输出质量问题,请使用 detect_failures 相反。
get_exception_details 获取跟踪的完整错误详细信息——返回所有突出显示错误状态的观察结果。
get_error_count 获取一段时间内的总错误计数。

分数

工具 说明
fetch_scores 使用过滤器列出分数/评估——跟踪ID、分数名称、时间范围。
list_scores_v2 v2使用更丰富的过滤器(会话ID、数据集运行ID、队列ID、配置ID、运算符/值等)为API评分。
get_score_v2 通过v2 Scores API通过ID获取单个分数。

提示

工具 说明
list_prompts 使用可选的名称过滤器列出项目中的所有提示。
get_prompt 按名称、版本或标签获取特定提示。
get_prompt_unresolved 获取一个占位符/依赖关系完整的提示(调试提示组合)。
create_text_prompt 使用可选标签和模型配置创建新的文本提示版本。
create_chat_prompt 使用消息数组和可选配置创建新的聊天提示版本。
update_prompt_labels 更新特定提示版本的标签(例如,升级为“生产”)。

数据集

工具 说明
list_datasets 列出项目中的所有数据集。
get_dataset 获取特定数据集的元数据。
list_dataset_items 使用分页列出数据集中的项目。
get_dataset_item 按ID获取单个数据集项
create_dataset 使用可选的描述和元数据创建新的数据集。
create_dataset_item 创建或追加销售数据集项。支持链接到源跟踪。
delete_dataset_item 按ID删除数据集项

注释队列

工具 说明
list_annotation_queues 列出项目中的所有注释队列。
create_annotation_queue 创建一个带有附加分数配置的新注释队列。
get_annotation_queue 按ID获取队列
list_annotation_queue_items 列出队列中的项目(可选择按状态筛选)。
get_annotation_queue_item 按ID获取队列项
create_annotation_queue_item 将跟踪或观察添加到队列中以供查看。
update_annotation_queue_item 更改队列项目的状态(待定/已完成)。
delete_annotation_queue_item 从队列中删除项目。
create_annotation_queue_assignment 将审阅者分配到队列。
delete_annotation_queue_assignment 从队列中删除审阅者。

指标

工具 说明
get_daily_metrics Langfuse的预汇总每日汇总(跟踪计数、成本、每天的代币)。对于长窗口,比按跟踪聚合更快。

用户

工具 说明
list_users 在一个时间窗口内(默认为过去30天)按跟踪计数的顶级用户。包裹廊坊 /metrics 查询API。

评论

工具 说明
list_comments 列出附加到跟踪/观察/会话/提示的注释,并使用过滤器。
get_comment 按ID获取单个评论
create_comment 在跟踪/观察/会话/提示上创建标记注释。

模型

工具 说明
list_models 在Langfuse的模型注册表中列出模型定义(定价+标记器配置)。
get_model 按ID获取单个模型定义

项目

工具 说明
list_projects 发现:返回已配置的Langfuse项目和默认项目的列表。

模式

工具 说明
get_data_schema 获取Langfuse项目的数据模式——跟踪、观察、分数、会话的可用字段和类型。

例题

连接后,向您的AI助手提出以下问题:

代理商和管道健康状况

  • “本周哪些代理人失败最多?”
  • “按代理人姓名计算的失败率是多少?”
  • “哪个代理的准确性最差?”
  • “按微量显示前5名代理商”
  • “是否有任何代理始终比其他代理慢?”
  • 按准确性、延迟和成本比较所有代理

准确性和质量

  • “我们本周的总体准确率是多少?”
  • “过去30天每周的准确度趋势是什么?”
  • “比较不同代理的准确性”
  • “每日准确率细分是多少?”
  • “哪些用户的准确度最差?”
  • “有反馈分数的痕迹百分比是多少?”

故障与调试

  • “给我看看今天的失败例子”
  • “最常见的故障模式是什么?”
  • “哪些用户看到的失败最多?”
  • “代理人的失败率是多少?”
  • “与上一周相比,本周的失败是增加还是减少?”
  • “向我展示法学硕士说‘不能’或‘我不能’的痕迹”

令牌使用情况

  • “P90和P99代币使用统计数据是什么?”
  • “哪些代理消耗的代币最多?”
  • “比较不同用户组的令牌使用情况”
  • “是否有用户的代币数量异常高?”

上下文窗口违规

  • “是否有任何一代人超过了128K的上下文窗口?”
  • “显示每代令牌使用量超过20万的痕迹”
  • “漏洞严重程度分布是什么?”
  • “哪些用户触发的上下文窗口漏洞最多?”

会议和参与

  • “我们的多回合率是多少?”
  • “会话平均有多深?”
  • “哪些用户的会话最深?”
  • “本周有多少次单轮和多轮会议?”
  • “平均会话成本是多少?”

成本

  • “这周我们每天花多少钱?”
  • “过去30天的每周成本趋势是什么?”
  • “哪个代理最贵?”
  • “哪些用户的成本最高?”
  • “每条追踪的平均成本是多少?”

延迟

  • “P95的延迟是多少?”
  • “延迟是否会随着时间的推移而恶化?”
  • “哪个型号最慢?”
  • “比较代理之间的延迟”
  • “按型号显示每代延迟细分”
  • “哪些用户的延迟最高?”

注释和回写

  • “用‘需求审查’对今天的所有失败痕迹进行评分”
  • “将这些跟踪ID标记为数据集创建的‘高质量’”
  • “将跟踪abc-123标记为0分,并评论‘幻觉输出’”

查找与探索

  • “获取最后20条痕迹”
  • “显示跟踪abc-123及其所有观测值”
  • “列出用户的会话alice@example.com"
  • “过去24小时发生了什么错误?”
  • “本周发生了多少错误?”
  • “显示项目中的所有提示”
  • “列出所有数据集”
  • “痕迹和观测中有哪些字段可用?”

分组选项

这 group_by 参数控制如何在分析工具中分割痕迹:

价值 分组依据 何时使用
name 跟踪/代理名称 (默认) 比较不同代理或管道的性能
userId 按用户细分 识别有问题或使用率高的用户
domain 从userId提取的电子邮件域 多租户应用程序,其中用户具有基于电子邮件的ID(例如。, user@acme.com → acme.com)
tag 跟踪标签 在标记的环境、版本或实验之间进行比较

选择性工具加载

仅加载减少令牌开销所需的工具组:

# Only load traces and analytics tools
LANGFUSE_TOOLS=traces,analytics langfuse-mcp-server

# Only load prompts and datasets
LANGFUSE_TOOLS=prompts,datasets langfuse-mcp-server

# In Claude Code
claude mcp add \
  -e LANGFUSE_PUBLIC_KEY=pk-lf-... \
  -e LANGFUSE_SECRET_KEY=sk-lf-... \
  -e LANGFUSE_TOOLS=traces,observations,analytics \
  langfuse-mcp -- uvx langfuse-mcp-server

可用组:

组 工具 计数
traces fetch_traces, fetch_trace 2
observations fetch_observations, fetch_observation 2
sessions fetch_sessions, get_session_details, get_user_sessions 3
errors find_exceptions, get_exception_details, get_error_count 3
scores fetch_scores 1
prompts list_prompts, get_prompt, create_text_prompt, create_chat_prompt, update_prompt_labels 5
datasets list_datasets, get_dataset, list_dataset_items, get_dataset_item, create_dataset, create_dataset_item, delete_dataset_item 7
annotation_queues 所有10个注释队列工具 10
metrics get_daily_metrics 1
users list_users 1
comments list_comments, get_comment, create_comment 3
models list_models, get_model 2
projects list_projects 1
schema get_data_schema 1
analytics 全部9个分析工具 9

如果 LANGFUSE_TOOLS 如果未设置,则加载了所有56个工具。


只读模式

禁用写入操作(score_traces, create_dataset, create_dataset_item, delete_dataset_item, create_text_prompt, create_chat_prompt):

LANGFUSE_MCP_READ_ONLY=true

如何比较

vs廊坊MCP官方

能力 此服务器 Langfuse MCP官方
痕迹和观察 是 否
会话和用户 是 否
异常跟踪 是 否
提示管理 是 是
数据集管理 是 否
分数回写 是 否
选择性工具加载 是 否
准确性指标 是 否
故障检测 是 否
令牌百分比 是 否
成本明细 是 否
延迟分析 是 否
会话分析 是 否
上下文泄露扫描 是 否
用户组聚合 是 否

官方的Langfuse MCP(5个工具)侧重于快速管理。该服务器提供完整的可观察性覆盖以及9个分析工具。

与其他Langfuse MCP实现相比

能力 此服务器 其他
数据访问(跟踪、观察、会话) 是 是
提示和数据集管理 是 是
异常跟踪 是 是
注释队列 是 部分
选择性工具加载 是 是
多项目支持 是 没有
准确度指标 是 没有
LLM故障检测 是 没有
代币百分位数(TP50/P90/P95/P99) 是 没有
按组/时间划分的成本明细 是 没有
每个模型细分的延迟分析 是 没有
多回合会话分析 是 没有
上下文窗口漏洞扫描 是 没有
用户/租户组聚合 是 没有
分数回写 是 没有

其他实现使用同步HTTP客户端提供数据访问(获取原始跟踪、观察、会话)。此服务器添加了 计算层 --在服务器端聚合、检测模式和计算统计数据的分析工具,以及 异步架构 这基本上更快。

架构 此服务器 其他
异步HTTP客户端 是 (httpx.AsyncClient) 否(同步请求/httpx)
并发观测获取 是 (异步收集) 否(按跟踪顺序)
TTL缓存 是 (直播5分钟,历史1小时) 否
自适应速率限制 是 (令牌桶,429回退) 否(固定睡眠)
批量观察查询 是 (带自动回退) 否(每条跟踪N+1)
克劳德代码子代理 是 (.claude/agents/) 否

vs平台嵌入式人工智能(Braintrust Loop、LangSmith Insights、Arize Alyx)

能力 此服务器 平台AI助手
开源 是 否
适用于任何MCP客户端 是 平台已锁定
自托管Langfuse支持 是 不适用
实时对话 是 各不相同(仅限部分批次)
自定义分组/分段 是 有限
回复Langfuse 是 平台特定
免费 是 付费等级

建筑

为什么使用异步httpx而不是Langfuse SDK?

这 Langfuse Python SDK 非常适合 写作 跟踪(它在后台异步批处理和发送)。但为了 阅读 大规模跟踪——这就是分析MCP服务器所做的——SDK有一个局限性: 其读取的API是同步的,建立在 requests 图书馆。

此服务器使用 httpx.AsyncClient 相反,这使得:

  • 并发观测获取 --通过以下方式同时获取100条记录的观测值 asyncio.gather,不是一个接一个
  • 非阻塞分页 --在不阻塞事件循环的情况下对数千条跟踪进行分页
  • 速率受限并发 — asyncio.Semaphore +令牌桶控制吞吐量,无需 time.sleep() 阻塞

实测影响: analyze_latency 在每天240万次观测的自托管实例上,每代故障从110秒下降到20秒(快5.4倍)。

缓存策略

使用两层内存TTL缓存 cachetools.TTLCache:

数据时代 TTL 基本原理
今天的数据 5分钟 仍在变化,缓存时间短
历史数据(今天之前) 1小时 不会更改,缓存速度很快

缓存在API页面级别运行。如果你打电话 aggregate_by_group 然后 compute_accuracy 对于相同的时间范围,第二次调用会访问所有跟踪页的缓存——只获取新的分数。

通过配置 LANGFUSE_CACHE_TTL 和 LANGFUSE_CACHE_TTL_HISTORICAL (秒)。

速率限制

全球代币桶利率限制器遵守Langfuse API限制:

实例类型 默认RPM 行为
自托管 无限制(0) 无人工节流。全速,仅受服务器限制。
兰富士云(爱好) 30个要求/分钟 爱好级别的保守默认值
廊坊云(专业/团队) 设置 LANGFUSE_RATE_LIMIT_RPM=1000 付费计划的吞吐量更高

在HTTP 429响应中,限制器会自动将RPM减半并读取 Retry-After 头球这意味着服务器可以适应任何速率限制——云或自托管——而无需手动配置。

观测数据获取:批处理与并发

需要生成数据(令牌百分比、上下文破坏、延迟崩溃)的分析工具面临N+1问题:每个跟踪一个API调用以获取其观察结果。

此服务器使用两步策略:

  1. 尝试批量提取 --在内存中按traceId分组,在一次分页调用中获取时间范围内的所有观测值
  2. 如果音量太大 (>5000页/500K+次观察)-- 回退到并发每次跟踪获取 使用 asyncio.gather 具有信号量控制的并发性

这意味着服务器既可以处理小型项目(批处理更快),也可以处理大规模部署(并发目标获取避免下载数百万个不相关的观测值)。

通过子代理进行上下文隔离

服务器随附 Claude Code定制代理 在 .claude/agents/langfuse-analyst.md当用户询问与Langfuse相关的问题时,Claude Code可以委托给该代理,该代理:

  • 仅加载Langfuse MCP工具(不加载会话中的其他工具)
  • 具有专门的系统提示,其中包含工具分类和工作流模式
  • 在独立的上下文窗口中运行,保持主要对话的整洁
  • 返回父对话的摘要

这可以防止33个工具模式(约5000个令牌)污染每次对话。


贡献

看 贡献.md 用于开发设置、代码风格指南和贡献领域。

安全

看 安全.md 用于安全策略、漏洞报告和API密钥处理。

行为准则

看 代码_OF_CONDUCT.md.

许可证

麻省理工学院——见 许可证.