Stagehand错误重试:智能恢复策略实现

Stagehand错误重试:智能恢复策略实现

【免费下载链接】stagehand An AI web browsing framework focused on simplicity and extensibility. 【免费下载链接】stagehand 项目地址: https://gitcode.com/GitHub_Trending/stag/stagehand

引言:为什么需要智能错误重试?

在现代AI驱动的Web自动化框架中,错误处理不再是简单的"重试或失败"二元选择。Stagehand作为专注于简洁性和可扩展性的AI网页浏览框架,其错误重试机制体现了深度智能化的设计理念。本文将深入解析Stagehand的错误重试策略,展示其如何通过多层次、智能化的恢复机制确保自动化任务的可靠性。

Stagehand错误重试架构概览

Stagehand的错误重试系统采用分层架构,包含以下几个核心组件:

mermaid

核心重试策略详解

1. LLM API调用重试机制

Stagehand在LLM客户端实现了智能重试策略,主要针对OpenAI API调用:

async createChatCompletion<T = LLMResponse>({
  options: optionsInitial,
  logger,
  retries = 3,  // 默认重试次数
}: CreateChatCompletionOptions): Promise<T> {
  
  // 错误处理逻辑
  if (error instanceof ZodSchemaValidationError) {
    logger({
      category: "openai",
      message: "Response failed Zod schema validation",
      level: 0,
    });
    if (retries > 0) {
      return this.createChatCompletion({
        options: options as ChatCompletionOptions,
        logger,
        retries: retries - 1,  // 递减重试计数
      });
    }
    throw new CreateChatCompletionResponseError(e.message);
  }
}

重试触发条件:

  • Schema验证失败(ZodSchemaValidationError)
  • 工具调用响应解析失败
  • O1模型特定选项处理错误

2. Self-Healing自动修复机制

Stagehand的actHandler实现了强大的Self-Healing功能,当Playwright操作失败时:

public async actFromObserveResult(
  observe: ObserveResult,
  domSettleTimeoutMs?: number,
): Promise<ActResult> {
  
  try {
    await this._performPlaywrightMethod(method, args, selector, domSettleTimeoutMs);
  } catch (err) {
    if (!this.selfHeal || err instanceof PlaywrightCommandMethodNotSupportedException) {
      // 直接返回失败
      return { success: false, message: `Failed to perform act: ${err.message}` };
    }
    
    // Self-Healing流程
    this.logger({
      category: "action",
      message: "Error performing act. Reprocessing the page and trying again",
      level: 1,
    });
    
    // 重新观察页面并选择新元素
    const observeResults = await this.stagehandPage.observe({ instruction });
    if (observeResults.length === 0) {
      return { success: false, message: `Failed to self heal act: No observe results found` };
    }
    
    // 使用新选择器重试
    const element: ObserveResult = observeResults[0];
    await this._performPlaywrightMethod(observe.method, observe.arguments, element.selector);
  }
}

3. 超时控制与竞态处理

Stagehand实现了精确的超时控制机制:

public async observeAct(
  actionOrOptions: ActOptions,
  observeHandler: StagehandObserveHandler,
  llmClient: LLMClient,
  requestId: string,
): Promise<ActResult> {

  if (!actionOrOptions.timeoutMs) {
    return doObserveAndAct();
  }

  // 竞态条件:操作执行 vs 超时
  const { timeoutMs } = actionOrOptions;
  return await Promise.race([
    doObserveAndAct(),
    new Promise<ActResult>((resolve) => {
      setTimeout(() => {
        resolve({
          success: false,
          message: `Action timed out after ${timeoutMs}ms`,
          action,
        });
      }, timeoutMs);
    }),
  ]);
}

错误分类与处理策略

Stagehand定义了丰富的错误类型,每种类型都有特定的处理策略:

错误类型重试策略最大重试次数退避策略
ZodSchemaValidationError立即重试3次无退避
PlaywrightCommandExceptionSelf-Healing1次页面重新观察
StagehandElementNotFoundError元素重定位2次XPath调整
LLMResponseErrorAPI重试3次指数退避
TimeoutError超时重试1次超时时间调整

智能重试的最佳实践

1. 配置合理的重试参数

// 推荐配置
const stagehand = new Stagehand({
  retryConfig: {
    maxRetries: 3,
    retryDelay: 1000, // 1秒基础延迟
    backoffFactor: 2, // 指数退避因子
    timeoutMs: 30000, // 30秒超时
  },
  selfHeal: true, // 启用Self-Healing
});

2. 错误监控与日志记录

Stagehand提供了详细的错误日志记录:

logger({
  category: "action",
  message: "Error performing act from an ObserveResult",
  level: 1,
  auxiliary: {
    error: { value: err.message, type: "string" },
    trace: { value: err.stack, type: "string" },
    observeResult: { value: JSON.stringify(observe), type: "object" },
  },
});

3. 自定义重试策略

// 自定义错误处理器
class CustomRetryHandler {
  async handleError(error: StagehandError, context: RetryContext) {
    if (error instanceof NetworkError) {
      // 网络错误使用指数退避
      await this.exponentialBackoff(context.retryCount);
    } else if (error instanceof DOMError) {
      // DOM错误尝试刷新页面
      await context.page.reload();
    }
  }
}

性能优化与成本控制

Stagehand的重试机制不仅关注成功率,还注重性能和成本:

mermaid

成本控制策略:

  • LLM缓存减少重复请求
  • 智能重试避免无意义尝试
  • 超时控制防止资源浪费

实战案例:电商自动化中的错误处理

假设我们需要自动化处理电商网站的购物车操作:

async function addToCartAutomation() {
  try {
    // 尝试添加商品到购物车
    const result = await page.act("click add to cart button", {
      timeoutMs: 15000,
      retries: 2
    });
    
    if (!result.success) {
      // Self-Healing: 重新观察页面寻找添加按钮
      const observeResults = await page.observe("find add to cart button");
      if (observeResults.length > 0) {
        await page.actFromObserveResult(observeResults[0]);
      }
    }
  } catch (error) {
    // 处理特定类型的错误
    if (error instanceof ElementNotFoundError) {
      logger.warn("元素未找到,尝试刷新页面");
      await page.reload();
      await addToCartAutomation(); // 递归重试
    }
  }
}

总结与展望

Stagehand的错误重试机制体现了现代AI自动化框架的智能化特点:

  1. 多层次重试策略:从简单的API重试到复杂的Self-Healing
  2. 智能错误分类:根据不同错误类型采取最合适的恢复策略
  3. 性能成本平衡:在确保成功率的同时控制资源消耗
  4. 可扩展架构:支持自定义重试处理器和错误处理逻辑

未来,随着AI技术的发展,Stagehand的错误重试机制可能会进一步演进,包括:

  • 基于机器学习的错误预测和预防
  • 自适应重试参数调整
  • 跨会话的错误模式学习
  • 实时性能监控和自动优化

通过深入理解和合理配置Stagehand的错误重试机制,开发者可以构建更加健壮和可靠的Web自动化应用,在复杂的网络环境中保持高成功率的同时控制成本和性能开销。

【免费下载链接】stagehand An AI web browsing framework focused on simplicity and extensibility. 【免费下载链接】stagehand 项目地址: https://gitcode.com/GitHub_Trending/stag/stagehand

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值