AgentOps 集成 Google GenAI(Gemini)SDK:同步、流式与 Token 计数的自动观测实践

发布时间:2026/11/7 22:42:32

AgentOps 集成 Google GenAI(Gemini)SDK:同步、流式与 Token 计数的自动观测实践 AgentOps 集成 Google GenAIGeminiSDK同步、流式与 Token 计数的自动观测实践【免费下载链接】agentopsPython SDK for AI agent monitoring, LLM cost tracking, benchmarking, and more. Integrates with most LLMs and agent frameworks including CrewAI, Agno, OpenAI Agents SDK, Langchain, Autogen, AG2, and CamelAI项目地址: https://gitcode.com/GitHub_Trending/ag/agentops本文以 examples/google_genai/README.md 为核心讲解如何使用 AgentOps 自动为 Google Generative AIGeminiSDK 的调用埋点从环境准备、可直接运行的示例代码到 instrumentor 底层包装了哪些方法、捕获了哪些 span 属性与指标帮助你把 Gemini 的同步生成、流式生成与 token 计数完整纳入可观测体系。前置条件与依赖安装根据示例目录说明运行 gemini_example 需要Python 版本 3.10 3.13依赖安装pip install agentops google-generativeai示例目录的 requirements.txt 中同时列出了google-generativeai与google-genai两个包。需要注意仓库中实际的 instrumentation 实现instrumentor.py 声明的依赖为google-genai 0.1.0包装的是新版google-genai客户端from google import genai示例代码也正是基于该客户端编写因此建议以google-genai为准。另外运行示例需要两个环境变量环境变量用途AGENTOPS_API_KEYAgentOps 平台鉴权agentops.init时读取GEMINI_API_KEYGoogle GenAI 客户端genai.Client()鉴权示例通过dotenv加载本地.env文件并为两个变量提供了占位默认值见 gemini_example.py。示例代码逐段解析同步、流式与 Token 计数以下是对 gemini_example.py 的完整走读该脚本覆盖了三类调用形态同步生成、流式生成和 token 计数并用validate_trace_spans做程序化校验。初始化 AgentOps 与 Gemini 客户端agentops.init(trace_nameGoogle Gemini Example, tags[gemini-example, agentops-example]) client genai.Client()agentops.init()入口定义于 agentops/init.py内部委托给 AgentOpsClient.init完成初始化后AgentOps 会对已安装的第三方库执行自动插桩——其中就包括对google-genai客户端方法的包装示例代码本身不需要任何显式的埋点调用。trace_name与tags用于标识本次运行便于在 AgentOps 侧按标签检索。同步生成response client.models.generate_content( modelgemini-1.5-flash, contentsWhat are the three laws of robotics? ) print(response.text)client.models.generate_content是被插桩的核心同步入口之一。每次调用都会产生一个名为gemini.generate_content的 span见 instrumentor.py 中的 WrapConfig 定义自动记录模型名、prompt 内容、响应文本、token 用量等属性无需手动处理。流式生成response_stream client.models.generate_content_stream( modelgemini-1.5-flash, contentsExplain the concept of machine learning in simple terms. ) for chunk in response_stream: print(chunk.text, end)流式方法generate_content_stream不走通用的WrapConfig通道而是由专门的流式包装器处理STREAMING_METHODS 定义。其实现原理见下文 流式调用的 span 生命周期 一节。对调用方而言体验不变拿到的仍然是一个逐块 yield 文本的生成器。Token 计数token_response client.models.count_tokens( modelgemini-1.5-flash, contentsThis is a test sentence to count tokens. ) print(fToken count: {token_response.total_tokens})count_tokens以及compute_tokens同样在插桩列表内对应 span 名为gemini.count_tokens并从返回对象中提取total_tokens写入 token 用量属性get_token_counting_attributes。程序化校验 span 是否上报示例最后用 AgentOps 提供的校验接口确认所有 LLM span 已被正确记录try: agentops.validate_trace_spans(trace_contextNone) print(\n✅ Success! All LLM spans were properly recorded in AgentOps.) except agentops.ValidationError as e: print(f\n❌ Error validating spans: {e}) raisevalidate_trace_spans的实现在 agentops/validation.py。这一做法适合放进集成测试或 CI 中验证 instrumentation 确实生效、span 确实到达了 AgentOps 后端而不仅仅是打印日志“看起来正常”。Instrumentor 原理哪些方法被包装GoogleGenaiInstrumentor 继承自 CommonInstrumentor通过wrapt.wrap_function_wrapper对google.genai.models模块下的方法做运行时包装。从 WRAPPED_METHODS 列表 可以确认覆盖范围同步与异步成对被包装方法类.方法span 名属性提取器Models.generate_content/AsyncModels.generate_contentgemini.generate_contentget_generate_content_attributesModels.count_tokens/AsyncModels.count_tokensgemini.count_tokensget_token_counting_attributesModels.compute_tokens/AsyncModels.compute_tokensgemini.compute_tokensget_token_counting_attributesModels.generate_content_stream/AsyncModels.generate_content_streamgemini.generate_content_stream异步为_async后缀专用流式包装器两点设计值得注意流式方法单独处理。流式接口返回的是生成器普通的“调用前开始 span、调用后结束 span”模式无法覆盖整个消费周期因此 _custom_wrap 使用STREAMING_METHODS配置单独挂载包装器异步版本则挂generate_content_stream_async_wrapper。容错包装。_custom_wrap与 _custom_unwrap 均捕获AttributeError/ModuleNotFoundError若google-genai未安装或方法签名不匹配插桩会静默跳过并记录 debug 日志不会让宿主应用崩溃。此外instrumentor 通过 StandardMetrics.create_standard_metrics 注册了标准 LLM 指标输入/输出/总 token、操作耗时、异常计数等 OpenTelemetry metrics与 span 属性互补可用于聚合看板。Span 属性详解从请求参数到响应元数据请求侧模型名与生成参数映射extract_request_attributes 负责解析请求参数model参数支持字符串或带_model_name/name属性的模型对象统一写入LLM_REQUEST_MODELstream参数写入LLM_REQUEST_STREAMINGconfig即GenerateContentConfig对象通过 REQUEST_CONFIG_ATTRIBUTES 映射表 反射提取生成参数Google SDK 参数映射到的 span 属性temperatureLLM_REQUEST_TEMPERATUREmax_output_tokensLLM_REQUEST_MAX_TOKENStop_pLLM_REQUEST_TOP_Ptop_kLLM_REQUEST_TOP_KseedLLM_REQUEST_SEEDsystem_instructionLLM_REQUEST_SYSTEM_INSTRUCTIONpresence_penalty/frequency_penalty对应 penalty 属性stop_sequencesLLM_REQUEST_STOP_SEQUENCEScandidate_countLLM_REQUEST_CANDIDATE_COUNT也就是说如果你在示例中这样调用from google.genai import types response client.models.generate_content( modelgemini-1.5-flash, contents..., configtypes.GenerateContentConfig(temperature0.7, max_output_tokens1024), )temperature0.7与max_output_tokens1024会自动出现在对应 span 的属性中无需任何额外代码。Prompt 与响应侧多形态内容归一化_extract_content_from_prompt 处理 Gemini SDK 接受的各种contents形态——纯字符串、parts 列表、ContentDict字典、带parts属性的对象等——统一归一为文本_set_prompt_attributes 再按消息序号写入PROMPT_CONTENT/PROMPT_ROLE多轮对话时逐项编号。响应侧由 _set_response_attributes 处理response.model→ 响应实际模型response.usage_metadata中的prompt_token_count/candidates_token_count/total_token_count→ 对应 token 用量属性这是成本统计的数据来源响应文本优先取response.text若走candidates结构则逐 candidate 拼接parts中的文本并记录finish_reason。所有 span 都会带上LLM_SYSTEM Gemini以及库名/库版本LIBRARY_NAME等公共属性方便在平台侧按 provider 过滤。流式调用的 span 生命周期流式包装器的完整实现见 stream_wrapper.py。其关键逻辑span 提前创建调用generate_content_stream时立即以SpanKind.CLIENT打开 spanL50-L62写入请求属性并标记LLM_REQUEST_STREAMING True。逐块透传并累积内部instrumented_stream()生成器对原始流逐块yield同时拼接chunk.text到full_text并记住最后一个携带usage_metadata的 chunkL78-L99。流结束后收尾流正常耗尽时把累积的full_text写入完成内容属性从最后一个带元数据的 chunk 提取 prompt/candidates/total 三个 token 计数并将 span 状态置为OKspan 在finally中结束L101-L124。异常路径流消费中抛错会record_exception并写入错误消息/类型属性span 置为ERROR状态后原样抛出不影响业务代码的异常处理。抑制开关包装器检查 OpenTelemetry 的_SUPPRESS_INSTRUMENTATION_KEYL47-L48支持在特定上下文里临时关闭插桩。异步版 generate_content_stream_async_wrapper 逻辑完全对称span 名为gemini.generate_content_stream_async。验证与延伸阅读跑通 examples/google_genai/gemini_example.py 后validate_trace_spans返回成功即说明同步、流式、token 计数三类 span 均已正确记录对应的 notebook 版本为 gemini_example.ipynb。模块级说明见 google_genai 插桩 README其中列出的指标输入/输出/总 token、耗时、异常数即上文StandardMetrics注册的内容。如果你想为其他 providerOpenAI、Anthropic 等搭建同类观测可参考同级的 providers 目录结构 与 instrumentation 总览文档。【免费下载链接】agentopsPython SDK for AI agent monitoring, LLM cost tracking, benchmarking, and more. Integrates with most LLMs and agent frameworks including CrewAI, Agno, OpenAI Agents SDK, Langchain, Autogen, AG2, and CamelAI项目地址: https://gitcode.com/GitHub_Trending/ag/agentops创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/5 19:54:13

RK3588安卓系统内置第三方输入法:完整方案与避坑指南

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

2026/11/7 22:40:20

电工作业防护装备在哪考?别被中介坑了,看这篇就够了

电工作业防护装备在哪考?别被中介坑了,看这篇就够了 你是不是也遇到过这种情况:想考个电工作业防护装备证书,但不知道在哪考?怕被中介骗钱?其实,流程比你想象中简单,关键是要选对地方、走对流程。今天我就从许昌市政公用工程从业者的角度,告诉你怎么…

2026/11/7 22:40:20

你学历不高怕报不上名?建设局特种工图片保姆级教程来了

你学历不高怕报不上名?建设局特种工图片保姆级教程来了 你学历不高怕报不上名?别担心,建设局特种工图片保姆级教程来了,让你轻松搞定特种作业证,别再被“学历门槛”拦住脚步。今天我们就来聊聊建设局特种工图片相关的政策,以及如何顺利报考、考试、复审…

2026/11/7 22:40:20

建设局特种工图片全流程办理指南通过率揭秘

建设局特种工图片全流程办理指南通过率揭秘 实操考试心里没底怕挂科?别慌,很多人在备考特种作业操作证时都遇到过这种情况。其实,只要你掌握了正确的备考方法,配合一些 通过率揭秘 的内部经验,通过考试并不是难事。这篇文章,我以…

2026/11/7 22:40:20

拿了电工证后需要什么全流程办理指南

拿了电工证后需要什么全流程办理指南 证书过期了不知道怎么复审延期?你不是一个人。我认识好几个老电工,因为没及时复审,直接被单位辞退,连项目都接不了。电工证这玩意儿,不是拿了就完事, 在哪考 、 怎么复审 、 哪里用得上…

2026/11/7 22:40:20

没学历也能考电工作业防护装备?在哪考你知道吗?

没学历也能考电工作业防护装备?在哪考你知道吗? 你是不是总觉得自己学历不高,连电工作业防护装备都报不上名?其实不是,这玩意儿 不看学历 ,只看有没有实践经验和通过考试,关键是你得知道 在哪考…

2026/11/7 22:35:20

电工证先给钱怎么报名?许昌转岗工人亲述避坑全过程

电工证先给钱怎么报名?许昌转岗工人亲述避坑全过程 找工作处处碰壁,电工证还没到手,面试官直接pass?你不是一个人在战斗。我之前在许昌做建筑工,听说电工证能拓宽就业面,就赶紧去报名,结果差点被“先给钱再培训”的套路骗了。今天就把我的真实经历…

2026/11/7 14:54:47

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

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

2026/11/7 14:50:12

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/7 0:03:08

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。特别是在郑州这样的城市,很多施工企业负责人和一线作业人员在报考电工证和钳工证时都面临着同样的困惑。到底该考哪个证?哪个更适合自己?哪个证书…

2026/11/7 0:03:08

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱?

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱? 之前考的证在外省能不能转过来?这个问题我遇到太多了,今天就拿广西电工证办理流程来具体说说,别再走弯路了。广西电工证的报考、复审、继续教育这些环节,如果你不了解,真的会吃大亏,尤其对于从…

2026/11/7 0:03:08

电气电工证都有哪些保姆级教程

电气电工证都有哪些保姆级教程 你是不是正愁不知道去哪报名,怕被中介坑?别急,这篇保姆级教程专为河南初次报考人员准备,帮你搞清楚 电气电工证都有哪些 ,以及如何避开那些坑。 电气电工证都有哪些?别被五花八门的证书搞懵了…

2026/11/7 14:54:47

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

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

2026/11/7 14:50:12

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
免费获取方案
☎咨询二维码 ☎ ↑