#705·agentic

回归: ExaClient (@agentic/exa >= 7.6.3) 在 Docker 环境中导致超时(节点 18 Alpine / DigitalOcean)

作者: steveoon创建于 2025年4月9日更新于 2025年9月22日

Hi Team, 我遇到了一个问题,从版本 `^7.6.3` 开始, `@agentic/exa` (以及可能相关的 `@agentic/*` 包) 出现了回退问题。使用 `ExaClient` 的调用在特定的 Docker 环境中部署的应用程序中始终超时,而使用版本 `7.3.3` 时则完全正常。 **错误描述:** 如果使用一个利用 `ExaClient.search()` 和可能的 `ExaClient.getContents()` 的工具(例如网络搜索工具),则在将 `@agentic/exa` 和相关的 `@agentic/*` 包从版本 `7.3.3` 升级到 `^7.6.3` 后,操作就会超时。 - **正常情况:** 如果所有 `@agentic/*` 包都处于版本 `7.3.3` 状态,则在 DigitalOcean 上部署的 Docker 容器中,该工具将成功执行。 - **失败情况:** 将 `@agentic/*` 包升级到 `^7.6.3` (或最新的已解决版本)后,在 *完全相同的环境* 中部署的 *完全相同的工具代码* 会在 `ExaClient` 操作期间始终超时。 - 使用较新版本(`^7.6.3`)在本地或 Vercel 上部署时,工具将正常工作。 这个问题似乎特定于升级库后的 Docker/DigitalOcean 环境组合。 **环境:** - `@agentic/exa` 失败版本: `^7.6.3` (以及相关的 `@agentic/*` 包) - `@agentic/exa` 正常版本: `7.3.3` (以及相关的 `@agentic/*` 包) - Node.js 版本: `18` (具体是 `node:18-alpine` Docker 基础镜像) - 部署环境: 在 DigitalOcean Droplet 上运行的 Docker 容器(1vCPU / 1GB RAM) - 操作系统(主机): Ubuntu(假设,典型的 DO) - 反向代理: Nginx(检查了配置,似乎不太可能是原因) **重现步骤:** 1. 使用 `@agentic/[email protected]` 创建一个 Next.js 应用程序。包含一个调用 `ExaClient.search()` 和/或 `ExaClient.getContents()` 的工具。 2. 使用 `node:18-alpine` 作为基础构建一个 Docker 镜像。 3. 将容器部署到 DigitalOcean Droplet(或类似的资源受限的 Linux 环境)。确保正确将 `EXA_API_KEY` 环境变量传递给容器。 4. 触发工具 -> **预期:** 它应该正常运行。 5. 在 `package.json` 中将 `@agentic/*` 包更新为 `^7.6.3`。 6. 重新构建 Docker 镜像并重新部署到 *同一个* 环境。 7. 触发工具 -> **实际:** `ExaClient` 操作将超时。 **调试步骤:** - 从 Docker 容器内确认与 `api.exa.ai` 之间的网络连接,使用 `node -e "fetch(...)"`。使用正确的 `x-api-key` 头和 `EXA_API_KEY` 环境变量的直接 `fetch` 调用,即使在失败的容器内,也会以 200 状态码成功。 - 验证了容器内的 DNS 解析,确认 `api.exa.ai` 可用。 - 验证 `EXA_API_KEY` 环境变量是否正确设置并可在容器内访问,使用 `process.env`。 - 检查了 Nginx 配置,似乎与之无关,因为它处理了入站请求。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 - 使用 `curl` 发送请求,确认 `api.exa.ai` 可用。 -

内容来源: transitive-bullshit/agentic