首页
/ GitHub_Trending/co/computer-use-preview日志系统详解:调试与问题定位最佳实践

GitHub_Trending/co/computer-use-preview日志系统详解:调试与问题定位最佳实践

2026-02-05 04:49:54作者:江焘钦

在日常开发和运维过程中,日志系统是排查问题、优化性能的关键工具。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.pyget_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  # 启用详细日志
)

关键日志位置

以下是调试过程中需要重点关注的日志输出位置:

  1. 模型响应错误agent.py - 打印模型调用异常详情
  2. 函数执行状态agent.py - 展示函数调用表格
  3. 安全确认提示agent.py - 安全操作确认信息
  4. 代理循环结束agent.py - 打印最终推理结果

问题定位流程

当遇到问题时,建议按照以下流程进行定位:

  1. 检查agent.py输出的异常信息,确定是否为模型调用错误
  2. 查看函数调用表格,确认参数是否正确传递
  3. 检查环境状态变化,通过computer.py中的current_state方法获取当前状态
  4. 若涉及浏览器操作,可查看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.RotatingFileHandlerTimedRotatingFileHandler

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

掌握这些日志调试技巧,将帮助你在使用和开发该项目时事半功倍,快速解决遇到的各种问题。

登录后查看全文
热门项目推荐
相关项目推荐