文章目录
-
[一 全局变量](#一 全局变量)
-
[二 函数调用关系图](#二 函数调用关系图)
-
[三 函数详细说明表](#三 函数详细说明表)
-
- [3.1 初始化函数](#3.1 初始化函数)
- [3.2 事件处理函数(4 个 Handler)](#3.2 事件处理函数(4 个 Handler))
-
- [3.2.1 _handle_state(event: Event) -> None](#3.2.1 _handle_state(event: Event) -> None)
- [3.2.2 _handle_message(event: Event) -> None](#3.2.2 _handle_message(event: Event) -> None)
- [3.2.3 _handle_tool(event: Event) -> None](#3.2.3 _handle_tool(event: Event) -> None)
- [3.2.4 _handle_flag(event: Event) -> None](#3.2.4 _handle_flag(event: Event) -> None)
- [3.3 辅助函数](#3.3 辅助函数)
-
- [3.3.1 _silence_langfuse_loggers()](#3.3.1 _silence_langfuse_loggers())
- [3.3.2 _get_or_create_user_id() -> str](#3.3.2 _get_or_create_user_id() -> str)
- [3.3.3 _subscribe_to_events() -> None](#3.3.3 _subscribe_to_events() -> None)
- [3.3.4 shutdown_langfuse() -> None](#3.3.4 shutdown_langfuse() -> None)
-
[四 完整执行流程时序图](#四 完整执行流程时序图)
-
[五 Span 层次结构图](#五 Span 层次结构图)
-
[六 关键设计模式总结](#六 关键设计模式总结)
-
- [6.1 延迟Span创建(Deferred Span Creation)](#6.1 延迟Span创建(Deferred Span Creation))
- [6.2 静默失败(Silent Failure)](#6.2 静默失败(Silent Failure))
- [6.3 单例模式(Singleton Pattern)](#6.3 单例模式(Singleton Pattern))
- [6.4 观察者模式(Observer Pattern)](#6.4 观察者模式(Observer Pattern))
-
Langfuse 是一个专为由大型语言模型(LLM)驱动的应用而设计的开源的可观测性和分析平台。它提供了一系列功能,如跟踪、评估、测试、调试和集成,帮助开发人员和组织构建并改进 LLM 应用程序。
一 全局变量
订阅事件
<<Module Level Variables>>
LangfuseGlobals
_langfuse_client: Any
_current_span: Any
_user_id: str | None
_session_target: str | None
_pending_session: dict[str, Any] | None
_tool_executed: bool
<<External>>
EventBus
get()
subscribe()
- 变量详细说明表
| 变量名 | 类型 | 说明 | 生命周期 |
|---|---|---|---|
_langfuse_client |
Any |
Langfuse SDK v3 客户端实例 | 初始化后 → shutdown |
_current_span |
Any |
顶层 span(相当于 trace) | 首次工具执行时创建 → session 结束时结束 |
_user_id |
`str | None` | 持久化用户 ID(~/.excalibur/user_id) |
_session_target |
`str | None` | 当前会话目标(IP/URL) |
_pending_session |
`dict[str, Any] | None` | 等待首次工具执行的会话数据 |
_tool_executed |
bool |
跟踪当前会话是否已执行任何工具 | 每次 session 期间有效 |
二 函数调用关系图
清理阶段
Span 创建流程
事件处理流程
初始化阶段
延迟创建
session 结束
span 已创建
init_langfuse
_silence_langfuse_loggers
_get_or_create_user_id
_subscribe_to_events
bus.subscribe STATE_CHANGED _handle_state
bus.subscribe MESSAGE _handle_message
bus.subscribe TOOL _handle_tool
bus.subscribe FLAG_FOUND _handle_flag
_handle_state: running
_handle_state: completed/error
_handle_message
_handle_tool
_handle_flag
首次工具执行时创建 session span
创建 agent-message nested span
创建 tool-name nested span
创建 flag-found nested span
shutdown_langfuse
_current_span.end
_langfuse_client.flush
三 函数详细说明表
3.1 初始化函数
init_langfuse(disabled: bool = False) -> bool102
职责: Langfuse 客户端的主入口,负责完整初始化流程。
Yes
No
LANGFUSE_ENABLED=false
true
init_langfuse
disabled?
return False
env var check
_silence_langfuse_loggers
设置环境变量 PK/SK/HOST
from langfuse import get_client
_langfuse_client = get_client
_user_id = _get_or_create_user_id
_subscribe_to_events
return True
3.2 事件处理函数(4 个 Handler)
3.2.1 _handle_state(event: Event) -> None
_handle_state(event: Event) -> None167
职责: 处理状态变更事件,管理 session span 的延迟创建和终结。
Yes
No: completed/error
Yes
No, _pending_session exists
_handle_state
state == 'running'?
设置 _session_target
_tool_executed = False
生成 session_id
_pending_session = ...
return
_current_span exists?
_current_span.update
_current_span.end
_langfuse_client.flush
return
静默丢弃 session
重置所有状态变量
return
3.2.2 _handle_message(event: Event) -> None
_handle_message(event: Event) -> None228
职责: 将代理消息作为嵌套 span 处理。
No
Yes
_handle_message
client & span exist?
return
获取 text, msg_type
_current_span.start_span
name='agent-message'
msg_span.end
return
3.2.3 _handle_tool(event: Event) -> None
_handle_tool(event: Event) -> None255
职责: 将工具执行作为嵌套 span 处理,首次工具执行时创建 session span。
No
Yes
Yes - 首次工具
No - 后续工具
Yes
_handle_tool
status == 'start'?
return
_pending_session & no current_span?
创建 session span
name='excalibur:target'
_current_span.update_trace
_langfuse_client.flush
_pending_session = None
_tool_executed = True
创建 tool-name nested span
current_span exists?
3.2.4 _handle_flag(event: Event) -> None
_handle_flag(event: Event) -> None317
职责: 将 flag 检测作为嵌套 span 处理。
No
Yes
_handle_flag
client & span exist?
return
获取 flag, context
_current_span.start_span
name='flag-found'
flag_span.end
return
3.3 辅助函数
3.3.1 _silence_langfuse_loggers()
_silence_langfuse_loggers() -> None
职责: 静默嘈杂的日志记录器,防止输出污染。
_silence_langfuse_loggers
定义 noisy_loggers 列表
遍历每个 logger
setLevel CRITICAL+1
propagate = False
return
3.3.2 _get_or_create_user_id() -> str
_get_or_create_user_id() -> str
职责: 获取或创建持久化用户 ID。
Yes
No
_get_or_create_user_id
读取 ./.excalibur/user_id
文件存在且有值?
返回存储的 ID
生成新 UUID
确保目录存在
写入 user_id 文件
返回新 ID
3.3.3 _subscribe_to_events() -> None
_subscribe_to_events() -> None151
职责: 订阅 EventBus 事件处理器。
_subscribe_to_events
bus = EventBus.get
bus.subscribe STATE_CHANGED _handle_state
bus.subscribe MESSAGE _handle_message
bus.subscribe TOOL _handle_tool
bus.subscribe FLAG_FOUND _handle_flag
3.3.4 shutdown_langfuse() -> None
shutdown_langfuse() -> None346
职责: 刷新并关闭 Langfuse 客户端。
No
Yes
shutdown_langfuse
_langfuse_client exists?
重置所有变量
_current_span.end
_langfuse_client.flush
重置所有变量
四 完整执行流程时序图
Langfuse Client EventBus Langfuse Module Application Langfuse Client EventBus Langfuse Module Application 初始化阶段 Session 开始 首次工具执行 工具执行中... loop [每个工具调用] Session 结束 Shutdown init_langfuse() _silence_langfuse_loggers() _get_or_create_user_id() subscribe all handlers get_client() emit STATE_CHANGED(running) store _pending_session emit TOOL(start) create session span (deferred) create tool-{name} nested span flush() emit TOOL(start/complete) create tool-{name} nested span emit STATE_COMPLETED _current_span.end() flush() shutdown_langfuse() reset all variables
五 Span 层次结构图
消息嵌套
工具嵌套
Session Span
excalibur:target
Tool Span
tool-name
Message Span
agent-message
Flag Span
flag-found
Sub-tool Span
Sub-message Span
- Span 属性说明
| Span 类型 | name 格式 | input | output | metadata |
|---|---|---|---|---|
| Session | excalibur:{target} |
{target, task, status} |
{final_state, target} |
{target, task, version, user_id, session_id} |
| Tool | tool-{name} |
{args} |
- | {tool_name} |
| Message | agent-message |
{message_type} |
{text} |
- |
| Flag | flag-found |
{context} |
{flag} |
{flag, context} |
六 关键设计模式总结
6.1 延迟Span创建(Deferred Span Creation)
- 问题: 避免记录空会话(用户启动但未执行工具就退出)
- 方案 :
running状态只存储_pending_session,首次工具执行时才创建 session span - 代码位置 :
_handle_state():167 +_handle_tool():255
6.2 静默失败(Silent Failure)
- 问题: 遥测错误不应影响主输出
- 方案 : 所有关键操作使用
contextlib.suppress(Exception) - 代码位置: 所有 handler 函数中
6.3 单例模式(Singleton Pattern)
- 问题: 确保全局只有一个 EventBus 实例
- 方案 :
_instance+_lock双重检查锁定 - 代码位置 :
EventBus.get():72
6.4 观察者模式(Observer Pattern)
- 问题: 解耦事件发布者和订阅者
- 方案: EventBus 作为中心枢纽,handler 函数作为观察者
- 代码位置 :
_subscribe_to_events():151