track_crewai 集成深度解析:Opik 如何追踪 CrewAI 的多智能体工作流

发布时间:2026/11/5 17:46:01

track_crewai 集成深度解析:Opik 如何追踪 CrewAI 的多智能体工作流 track_crewai 集成深度解析Opik 如何追踪 CrewAI 的多智能体工作流【免费下载链接】comet-llmDebug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards.项目地址: https://gitcode.com/GitHub_Trending/co/comet-llm本文以opik.integrations.crewai.track_crewai这一集成入口为核心完整讲解如何在 OpikComet 团队的 LLM 可观测平台中追踪 CrewAI 的多智能体活动包括 API 签名与参数含义、一次调用背后实际打补丁monkey-patch了哪些 CrewAI 方法、每个 span 会记录哪些 input/output 字段以及针对 CrewAI v1.0.0 的 Flow 与 LLM 客户端追踪机制。读完后你可以直接在生产代码中启用 CrewAI 追踪并能从源码层面解释平台上看到的 span 结构与 token 数据来源。1. track_crewai 是什么API 签名与参数语义CrewAI 集成文档页 track_crewai.rst 通过 Sphinx 的autofunction指令直接渲染 opik_tracker.py 中track_crewai的 docstring因此官方文档与源码保持逐字一致。该函数的完整签名为def track_crewai( project_name: Optional[str] None, crew: Optional[crewai.Crew] None, ) - None: Tracks CrewAI activities by enabling tracking decorators for various critical methods. The function applies tracking decorators to key CrewAI components and methods, enabling logging or monitoring of activities. Tracking is enabled globally and can only be initialized once. If you use this tracker - please avoid using of OpenAI tracker to prevent duplicate logging of LLM calls and token usage. Parameters: project_name: The name of the project to associate with the tracking. crew: The Crew instance to track. Required for CrewAI v1.0.0 to properly track LLM calls. 两个参数的语义要点参数类型说明project_nameOptional[str]追踪数据归属的 Opik 项目名为None时使用默认项目。crewOptional[crewai.Crew]要追踪的Crew实例。在 CrewAI v1.0.0 中必须传入否则无法正确追踪底层的 LLM 调用见第 5 节。docstring 同时强调了两个关键约束在接入前务必理解全局生效、仅可初始化一次Tracking is enabled globally and can only be initialized once。该函数通过替换 CrewAI 类的方法实现是进程级全局副作用重复调用没有意义。避免与 OpenAI tracker 同时使用please avoid using of OpenAI tracker to prevent duplicate logging of LLM calls and token usage。因为 CrewAI 集成本身已经接管了 LLM 调用层的埋点再叠加opik.integrations.openai会导致同一次 LLM 调用被记录两次token 用量重复计入成本统计。track_crewai仅由模块的__init__.py导出见init.py 中__all__ [track_crewai]因此标准导入方式为from opik.integrations.crewai import track_crewai2. 快速上手完整可运行的接入示例CrewAI 集成索引页 index.rst 给出了官方的最小接入示例在应用入口调用一次track_crewai(project_name...)随后按正常方式构建并运行Crew所有活动即自动上报 Opik。完整示例如下from opik.integrations.crewai import track_crewai from crewai import Agent, Crew, Task, Process class YourCrewName: def agent_one(self) - Agent: return Agent( roleData Analyst, goalAnalyze data trends in the market, backstoryAn experienced data analyst with a background in economics, verboseTrue, ) def agent_two(self) - Agent: return Agent( roleMarket Researcher, goalGather information on market dynamics, backstoryA diligent researcher with a keen eye for detail, verboseTrue ) def task_one(self) - Task: return Task( nameCollect Data Task, descriptionCollect recent market data and identify trends., expected_outputA report summarizing key trends in the market., agentself.agent_one() ) def task_two(self) - Task: return Task( nameMarket Research Task, descriptionResearch factors affecting market dynamics., expected_outputAn analysis of factors influencing the market., agentself.agent_two() ) def crew(self) - Crew: return Crew( agents[self.agent_one(), self.agent_two()], tasks[self.task_one(), self.task_two()], processProcess.sequential, verboseTrue ) track_crewai(project_namecrewai-integration-demo) my_crew YourCrewName().crew() result my_crew.kickoff() print(result)使用前提是已配置好 Opik 的连接API key / 服务地址与对应 LLM 提供商的 key如OPENAI_API_KEY。示例中track_crewai在kickoff()之前调用由于它是全局补丁放在应用启动阶段任何 Crew 执行之前即可。3. 一次 track_crewai 调用背后打了哪些补丁理解集成的关键在于track_crewai并不是装饰某个固定函数而是对 CrewAI 库的类与方法做运行时替换。在 opik_tracker.py 中一次调用按顺序完成以下动作analytics.track_event(integration, crewai) # 上报集成使用事件 decorator_factory crewai_decorator.CrewAITrackDecorator() crewai_wrapper decorator_factory.track(project_nameproject_name) # ① 核心三类对象的四个方法被替换为带追踪的包装 crewai.Crew.kickoff crewai_wrapper(crewai.Crew.kickoff) crewai.Crew.kickoff_for_each crewai_wrapper(crewai.Crew.kickoff_for_each) crewai.Agent.execute_task crewai_wrapper(crewai.Agent.execute_task) crewai.Task.execute_sync crewai_wrapper(crewai.Task.execute_sync) # ② 补丁 LiteLLMCrewAI v0.x 的底层 LLM 通道 patchers.patch_litellm_completion(project_nameproject_name) # ③ 补丁 Flow 类v1.0.0 才有 patchers.patch_flow(project_nameproject_name) # ④ 补丁 Agent 持有的 LLM 客户端v1.0.0且必须传入 crew if crew is not None and is_crewai_v1(): patchers.patch_llm_client(crew, project_name)逐项说明① 结构层追踪Crew / Agent / TaskCrew.kickoff、Crew.kickoff_for_each、Agent.execute_task、Task.execute_sync四个方法被CrewAITrackDecorator的track装饰器包装。这对应 CrewAI 工作流的三层结构——Crew 执行、Agent 执行任务、Task 同步执行——在 Opik 上会形成嵌套的 span 树。注意kickoff_for_each批量执行多组输入同样被覆盖因此批量任务也会逐组生成追踪。② LiteLLM 层追踪patchers/litellm_completion.py 将litellm.completion与litellm.acompletion分别替换为opik.integrations.litellm.track_completion(project_name...)的包装版本。CrewAI v0.x 内部经由 LiteLLM 发起 LLM 请求因此这两个补丁保证了 v0.x 下 LLM 调用含模型、token 用量也能进入 Opik。③ Flow 追踪v1.0.0见第 5 节。④ LLM 客户端追踪v1.0.0见第 5 节。此外函数体开头会调用analytics.track_event(integration, crewai)记录一次集成使用事件属于遥测性质不影响追踪数据本身。4. Span 的数据采集规则记录什么、叫什么名字span 的字段装配逻辑集中在 crewai_decorator.py 中的CrewAITrackDecorator继承自 Opik 通用BaseTrackDecorator见 base_track_decorator 体系。4.1 开始 span 时_start_span_inputs_preprocessor每个被追踪方法开始执行时都会创建一个typegeneral的 span统一打上metadata[created_from] crewai—— 标识数据来源框架tags [crewai]—— 便于在 Opik 前端按 tag 过滤按方法名区分的metadata[object_type]与差异化 input被追踪方法object_typespan 名称input 内容Crew.kickoff/kickoff_for_eachcrew函数原名kickoffkickoff(inputs...)传入的inputs字典Agent.execute_taskagentAgent 的role如Data Analyst{context: ..., agent: {backstory, goal, role, tools}}Task.execute_synctaskTask: {task.name}如Task: Collect Data Task{task: {config, context, description, expected_output, name, prompt_context, tools}}其中 Agent / Task 的 input 并非把整个对象序列化而是由白名单过滤——crewai_decorator.py 定义了三组常量经jsonable_encoder.encodedict_utils.split_dict_by_keys见_encode_dict_and_keep_keyscrewai_decorator.py保留指定键AGENT_KWARGS_KEYS_TO_LOG_AS_INPUTSbackstory、goal、role、toolsllm、max_iter、cache等其余参数被有意排除避免把不可 JSON 化或敏感的内部字段写入 spanTASK_KWARGS_KEYS_TO_LOG_AS_INPUTSconfig、context、description、expected_output、name、prompt_context、toolsTASK_KWARGS_KEYS_TO_LOG_AS_OUTPUTname、raw、summary。这种白名单设计意味着调整 span 中记录哪些字段只需要改这三组常量列表而不必动埋点流程。4.2 结束 span 时_end_span_inputs_preprocessor输出侧同样按object_type分流crewai_decorator.pycrew对整个输出CrewOutput做jsonable_encoder.encode并output_dict.pop(token_usage, None)—— 从 crew 级 span 的 output 中剥离 token 用量。因为 token 数据会由 LLM 层LiteLLM / provider 客户端以规范的 usage 字段单独记录避免在结构 span 里重复冗余agent输出统一包装为{output: output}task仅按白名单保留name、raw、summary三个字段。另外object_type键在结束 span 时通过metadata.pop(object_type)从 metadata 中取出使用不会残留到最终上报的 metadata 里。从 span 层级上看kickoff作为本次运行的根 spanAgent.execute_task与Task.execute_sync嵌套其下LLM 调用 span 又嵌套在 agent 执行之下由第 3 节 ②/④ 的补丁保证从而在 Opik 前端呈现一棵完整的执行树。5. CrewAI v1.0.0 的增强机制版本探测、Flow 与 LLM 客户端CrewAI v1.0.0 重构了 LLM 抽象不再一律走 LiteLLM因此集成提供了版本感知的增强路径。5.1 版本探测is_crewai_v1() 通过importlib.metadata.version(crewai)读取已安装版本并用opik.semantic_version.SemanticVersion.parse(version) 1.0.0判断读取失败如元数据缺失时静默返回False退化到 v0.x 的埋点路径。这也解释了 docstring 中 crew: Required for CrewAI v1.0.0 to properly track LLM calls 的由来——v1 下 LLM 调用追踪依赖patch_llm_client而它的输入正是这个crew实例。5.2 Flow 补丁patchers/flow.pyCrewAI v1.0.0 引入的Flow类状态机式编排在 patchers/flow.py 中被打了两处补丁均有幂等保护_patched标记与类不存在则跳过的容错CrewAI 旧版本下crewai.Flow不存在直接return并打 debug 日志Flow.__init__包装在 Flow 构造完成后遍历其注册的方法字典self._methods对每个尚未标记opik_tracked的方法动态套用opik_tracker.track(project_name..., tags[crewai], metadata{created_from: crewai})。也就是说用户在 Flow 中声明的每个start/listen/router方法都会自动成为独立 span无需逐个手动装饰重复 patch 由opik_tracked属性短路。Flow.kickoff_async包装用一个名为Flow.kickoff_async的 span 包裹异步入口。代码注释解释了为什么只包异步版本the sync version calls it internally——同步kickoff内部会调用kickoff_async包一处即可避免重复 span。5.3 LLM 客户端补丁patchers/llm_client.pypatch_llm_client(crew, project_name) 遍历crew.agents对每个agent.llm做 provider 探测与替换provider 探测目标复用的 Opik 集成OpenAICompletionopik.integrations.openai.track_openaiAnthropicCompletionopik.integrations.anthropic.track_anthropicGeminiCompletionopik.integrations.genai.track_genaiBedrockCompletionopik.integrations.bedrock.track_bedrock实现细节值得注意的两点探测本身是防御式的每个_is_*_llm函数在对应 provider 模块ImportError时返回False_patch_*_client整体再包一层try/except并仅LOGGER.warning——某个 provider 库缺失或 patch 失败不会中断应用运行客户端属性名有版本兼容处理_get_client_attribute_name注释说明 CrewAI 1.13.0 converted LLM classes to Pydantic BaseModel, moving the SDK client from a publicclientattribute to a Pydantic PrivateAttr_client因此会先探测_client、不存在再取clientllm_client.py。patch 完成后用 provider 集成返回的patched_client回写到 LLM 实例之后 Agent 发起的所有补全请求模型名、usage、token 成本都会由对应 provider 集成规范记录。5.4 v0.x 与 v1.x 的埋点差异小结从源码结构看两条 LLM 追踪路径是并行的v0.x 依赖 ②LiteLLM 补丁v1.x 依赖 ④provider 客户端补丁①结构层与 ③Flow可选对所有版本生效。因此在 v1.0.0 环境中调用track_crewai(project_name...)而不传crew时Crew/Agent/Task 层级 span 仍然生成但 LLM 调用 span 会缺失——这正是 docstring 把crew标注为 v1 Required ... to properly track LLM calls 的原因。6. 使用注意事项与常见问题只调用一次且尽早调用。补丁作用于类定义crewai.Crew.kickoff等必须在任何kickoff/ Flow 实例化之前执行Flow 的方法装饰发生在Flow.__init__内晚于track_crewai创建的 Flow 才能被追踪。不要叠加 OpenAI 集成。CrewAI 场景下 LLM 层已被本集成接管v0.x 走 LiteLLM 补丁、v1.x 走 provider 客户端补丁再启用opik.integrations.openai会对同一请求产生双重 span 与双重 token 统计。v1.0.0 请传入 crew 实例track_crewai(project_namemy-project, crewmy_crew)。span 命名规则决定了前端展示Agent span 直接以role命名、Task span 以Task: {name}命名见 4.1 节。如果你希望前端出现更可读的名称应从 CrewAI 侧的role/task.name入手而非在 Opik 侧重命名。输入/输出字段范围由白名单控制若需要在 span 中补充 CrewAI 对象的其他字段例如max_iter、output_file修改方向是扩展 crewai_decorator.py 中的三组键列表——但这是 SDK 源码层改动实际项目中通常通过metadata或自定义 span 补充信息。7. 测试与进一步阅读仓库内为 CrewAI 集成配套了三层集成测试可用作期望行为的权威参照test_crewai.py —— 基础 Crew/Agent/Task 追踪test_crewai_flows.py —— Flow 场景的 span 结构验证test_crewai_built_from_config.py —— 通过配置YAML/config方式构建 Crew 的追踪路径。其他值得深入的关键文件入口与版本探测sdks/python/src/opik/integrations/crewai/opik_tracker.pySpan 字段装配与白名单sdks/python/src/opik/integrations/crewai/crewai_decorator.py通用 track 装饰器参数结构TrackOptions/StartSpanParameterssdks/python/src/opik/decorator/arguments_helpers.py官方文档页本文主体来源track_crewai.rst 与 index.rst8. 小结track_crewai(project_name, crew)是 Opik 对 CrewAI 的一站式追踪入口一次调用同时完成结构层Crew/Agent/Task 四个核心方法、LLM 层LiteLLM 或四大 provider 客户端与 Flow 层v1.0.0的运行时补丁span 的命名、input/output 字段由明确的白名单常量控制token 用量则剥离到 LLM 层统一记录。把握全局一次性初始化、v1 必传 crew、勿叠加 OpenAI 集成这三条约束并对照第 4 节的字段规则理解平台上的 span 树即可把 CrewAI 多智能体应用的可观测性完整接入 Opik。【免费下载链接】comet-llmDebug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards.项目地址: https://gitcode.com/GitHub_Trending/co/comet-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/3 19:16:36

AGV小车与工业无线组网实战:从选型到联调的关键技术解析

干这行十来年,见过太多AGV项目从方案评审到上线运维的完整过程,但每次走进车间看到第一台AGV按路线稳稳跑起来的时候,还是会有一种“成了”的踏实感。这次广汽传祺车间项目落地,核心就两个东西:海康AGV小车负责搬运&am…

2026/10/31 19:53:33

CentOS 7安装PostgreSQL 15保姆级教程:从源码编译到远程连接实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑