GitHub_Trending/co/computer-use-preview日志系统详解:调试与问题定位最佳实践
在日常开发和运维过程中,日志系统是排查问题、优化性能的关键工具。GitHub_Trending/co/computer-use-preview项目的日志系统虽然未采用专业日志框架,但通过精心设计的打印语句和状态跟踪机制,依然能够有效支持调试与问题定位。本文将详细解析该项目的日志实现方式,帮助开发者快速掌握调试技巧和最佳实践。
日志系统架构概览
GitHub_Trending/co/computer-use-preview项目的日志系统主要通过print函数和termcolor库实现,核心代码集中在agent.py文件中。系统采用分层日志策略,将日志信息分为普通打印、彩色提示和表格输出三种类型,分别用于不同场景的信息展示。
日志类型分布
| 日志类型 | 实现方式 | 应用场景 | 代码位置 |
|---|---|---|---|
| 普通打印 | print() |
基本状态信息、错误详情 | agent.py |
| 彩色提示 | termcolor.cprint() |
警告、错误等重要信息 | agent.py |
| 表格输出 | rich.table.Table |
结构化数据展示 | agent.py |
日志流程控制
日志系统与代理循环紧密集成,形成完整的信息反馈机制。主要流程如下:
graph TD
A[开始代理循环] --> B[生成模型响应]
B --> C{是否成功}
C -->|是| D[提取推理和函数调用]
C -->|否| E[打印错误信息并重试]
D --> F[判断是否有函数调用]
F -->|是| G[执行函数并记录日志]
F -->|否| H[打印完成信息并退出]
G --> I[更新环境状态]
I --> B
关键日志实现解析
错误处理与重试机制
项目在agent.py的get_model_response方法中实现了带重试机制的错误处理,通过print输出异常信息,并使用指数退避策略进行重试:
def get_model_response(
self, max_retries=5, base_delay_s=1
) -> types.GenerateContentResponse:
for attempt in range(max_retries):
try:
response = self._client.models.generate_content(
model=self._model_name,
contents=self._contents,
config=self._generate_content_config,
)
return response # Return response on success
except Exception as e:
print(e) # 打印异常详情
if attempt < max_retries - 1:
delay = base_delay_s * (2**attempt)
message = (
f"Generating content failed on attempt {attempt + 1}. "
f"Retrying in {delay} seconds...\n"
)
termcolor.cprint( # 使用彩色打印警告信息
message,
color="yellow",
)
time.sleep(delay)
else:
termcolor.cprint( # 使用彩色打印错误信息
f"Generating content failed after {max_retries} attempts.\n",
color="red",
)
raise
结构化日志输出
在函数调用过程中,项目使用rich.table.Table创建结构化日志,清晰展示推理过程和函数调用信息:
table = Table(expand=True)
table.add_column(
"Gemini Computer Use Reasoning", header_style="magenta", ratio=1
)
table.add_column("Function Call(s)", header_style="cyan", ratio=1)
table.add_row(reasoning, "\n".join(function_call_strs))
if self._verbose:
console.print(table) # 打印结构化表格
print()
这种方式使开发者能够直观地了解代理的决策过程和执行步骤,极大提高了调试效率。
安全确认日志
项目在agent.py中实现了安全确认机制,当需要用户确认时,会输出详细的安全提示信息:
termcolor.cprint(
"Safety service requires explicit confirmation!",
color="yellow",
attrs=["bold"],
)
print(safety["explanation"]) # 打印安全说明
decision = ""
while decision.lower() not in ("y", "n", "ye", "yes", "no"):
decision = input("Do you wish to proceed? [Yes]/[No]\n")
调试实践指南
基本日志查看
默认情况下,项目会输出基本日志信息。要查看详细日志,可在运行时确保verbose参数设置为True(默认值):
agent = BrowserAgent(
browser_computer=computer,
query=args.query,
model_name=args.model,
verbose=True # 启用详细日志
)
关键日志位置
以下是调试过程中需要重点关注的日志输出位置:
- 模型响应错误:agent.py - 打印模型调用异常详情
- 函数执行状态:agent.py - 展示函数调用表格
- 安全确认提示:agent.py - 安全操作确认信息
- 代理循环结束:agent.py - 打印最终推理结果
问题定位流程
当遇到问题时,建议按照以下流程进行定位:
- 检查agent.py输出的异常信息,确定是否为模型调用错误
- 查看函数调用表格,确认参数是否正确传递
- 检查环境状态变化,通过computer.py中的
current_state方法获取当前状态 - 若涉及浏览器操作,可查看playwright.py中的相关方法实现
高级日志优化建议
虽然当前日志系统已能满足基本需求,但仍有以下优化空间:
引入专业日志框架
建议使用Python标准库中的logging模块替代直接使用print,实现日志级别控制和输出重定向:
import logging
# 初始化日志配置
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler("agent.log"),
logging.StreamHandler()
]
)
# 使用日志代替print
logging.error(f"Generating content failed: {e}")
增加日志上下文信息
在关键操作日志中增加更多上下文信息,如时间戳、代理ID等,便于分布式环境下的日志追踪:
# 改进示例
from datetime import datetime
def log_with_context(message, level="info"):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
context = f"[{timestamp}] [Agent ID: {self.agent_id}]"
full_message = f"{context} {message}"
if level == "info":
print(full_message)
elif level == "warning":
termcolor.cprint(full_message, color="yellow")
elif level == "error":
termcolor.cprint(full_message, color="red")
实现日志轮转
为避免日志文件过大,建议实现日志轮转机制,可使用logging.handlers.RotatingFileHandler或TimedRotatingFileHandler:
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler(
"agent.log",
maxBytes=1024*1024*5, # 5MB
backupCount=5 # 保留5个备份
)
总结
GitHub_Trending/co/computer-use-preview项目的日志系统通过简洁有效的设计,为开发者提供了必要的调试信息。本文详细介绍了日志系统的实现细节和使用方法,包括:
- 日志系统的架构和类型分布
- 关键日志实现代码解析
- 实际调试操作指南
- 日志系统的优化建议
通过合理利用现有日志和实施优化建议,开发者可以更高效地定位和解决问题,提升开发效率。完整的日志实现代码可参考agent.py文件,更多使用示例可查阅项目README.md。
掌握这些日志调试技巧,将帮助你在使用和开发该项目时事半功倍,快速解决遇到的各种问题。
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0201- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
awesome-zig一个关于 Zig 优秀库及资源的协作列表。Makefile00