PentestGPT V2源码研究之langfuse模型记录模块

文章目录

  • [一 全局变量](#一 全局变量)

  • [二 函数调用关系图](#二 函数调用关系图)

  • [三 函数详细说明表](#三 函数详细说明表)

    • [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))
  • PentestGPT V2 gitee镜像仓库地址

  • 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 初始化函数

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

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

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

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

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
定义 noisy_loggers 列表
遍历每个 logger
setLevel CRITICAL+1
propagate = False
return

3.3.2 _get_or_create_user_id() -> str

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
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

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
相关推荐
ShoreKiten9 小时前
DC-9靶机渗透--CTFer从0到1的进阶之路
网络安全·渗透测试
ShoreKiten12 小时前
DC-7靶机渗透:CTFer从0到1的进阶之路
网络安全·渗透测试
EdisonZhou12 小时前
MAF快速入门(21)RC5引入的Script运行能力
llm·agent·.net core
缘友一世1 天前
PentestGPT V2源码研究之EGATS规划器
网络安全·渗透测试
带刺的坐椅1 天前
SolonCode CLI v2026.4.5 发布(编码智能体)
ai·llm·ai编程·cli·claudecode·opencode·sloncode
蜘蛛侠..1 天前
什么是 Plan-and-Execute 模式?与ReAct模式区别?
java·ai·大模型·llm·agent·react·plan模式
MoonOut1 天前
LLM | 项目推荐:LLM 后训练 / Agent 相关的小规模开源项目
llm
deep_drink1 天前
1.2、Python 与编程基础:文件处理与常用库
开发语言·python·elasticsearch·llm
chaors1 天前
Agent来了0x0a:AutoGen 进阶
程序员·llm·agent