Skip to content

Bug: v0.0.16 版本的 post_file()/get_file() 认证问题修复无效 #43

@XeonYang

Description

@XeonYang

问题概述

PR #42 合并后发布了 v0.0.16 版本,声称修复了 Issue #41 中报告的 post_file()get_file() 方法缺少 auth() 调用的问题。但是该修复并未生效,仍然出现 401 未授权错误。

环境信息

  • agentrun-sdk 版本:0.0.16(从 0.0.14 升级)
  • Python 版本:3.12
  • 操作系统:Windows 10

问题时间线

  1. Issue post_file() and get_file() methods missing auth() call in DataAPI #41 报告了 post_file()get_file() 缺少 auth() 调用
  2. PR Add missing auth() calls to file upload/download methods #42 由 Copilot 创建,声称添加了缺失的 auth() 调用
  3. v0.0.16 版本发布
  4. 问题依旧 - 仍然出现 401 错误

复现步骤

from agentrun.sandbox import Sandbox, TemplateType

sandbox = Sandbox.create(
    template_type=TemplateType.AIO,
    template_name="your-template-name",
)
sandbox.__enter__()

# 在 v0.0.16 中仍然报 401 错误
result = sandbox.file_system.upload(
    local_file_path="local_file.txt",
    target_file_path="/tmp/file.txt"
)

错误信息(与之前相同)

{
  "code": "ERR_UNAUTHORIZED",
  "requestId": "...",
  "message": "missing API key in header X-API-Key or query parameter"
}

源码验证

检查 v0.0.16 版本的 .venv/Lib/site-packages/agentrun/utils/data_api.py 源码:

post_file() 方法(约 880-935 行):

def post_file(self, path, local_file_path, target_file_path, ...):
    url = self.with_path(path, query=query)
    req_headers = self.config.get_headers()
    req_headers.update(headers or {})
    # ❌ 这里仍然没有 auth() 调用!
    
    try:
        with open(local_file_path, "rb") as f:
            # ... 直接发起请求,没有认证 headers

正确写法(参考 get_video() 方法):

def get_video(self, path, save_path, ...):
    url = self.with_path(path, query=query)
    req_headers = self.config.get_headers()
    req_headers.update(headers or {})
    # ✅ 正确 - 调用 auth() 添加认证 token
    cfg = Config.with_configs(self.config, config)
    url, req_headers, query = self.auth(url, req_headers, query, config=cfg)

Copilot 修复失败的原因分析

根据 PR #42 中 Copilot 的评论,它声称做了以下修改:

Changes:

  • agentrun/utils/__data_api_async_template.py: Added auth() calls to post_file_async() and get_file_async()
  • agentrun/utils/data_api.py: Regenerated via codegen, propagating auth() to all four methods (sync + async variants)

问题:codegen 没有正确执行

Copilot 修改了模板文件 (__data_api_async_template.py),然后依赖 make codegen 重新生成 data_api.py

但是,检查 v0.0.16 版本中实际的 data_api.py 源码,发现 post_file()get_file() 方法中仍然没有 auth() 调用

这说明 codegen 步骤失败了

  1. Copilot 确实修改了模板文件 ✅
  2. make codegen 执行失败或没有正确生成 data_api.py
  3. CI 检查失败(验证了 codegen 输出不一致)
  4. 尽管 CI 失败,PR 还是被合并了,发布了一个没有真正修复的版本

证据

检查项 预期 实际
data_api.pypost_file() 有 auth() ✅ 有 ❌ 没有
data_api.pyget_file() 有 auth() ✅ 有 ❌ 没有
CI Run 93/94 状态 ✅ success ❌ failed

建议的修复方案

agentrun/utils/data_api.pypost_file() 方法中添加 auth() 调用:

def post_file(self, path, local_file_path, target_file_path, ...):
    url = self.with_path(path, query=query)
    req_headers = self.config.get_headers()
    req_headers.update(headers or {})
    
    # 添加这行代码(与 get_video() 方法一致):
    cfg = Config.with_configs(self.config, config)
    url, req_headers, query = self.auth(url, req_headers, query, config=cfg)
    
    # ... 方法的其余部分

同样的修复也需要应用于 get_file()post_file_async()get_file_async() 方法。

临时解决方案

在官方修复之前,用户可以手动调用 auth() 获取认证 headers:

sandbox = self._get_sandbox()

# 手动获取认证 headers
_, auth_headers, _ = sandbox.data_api.auth()

# 将 headers 传递给 post_file/get_file
result = sandbox.data_api.post_file(
    path="/filesystem/upload",
    local_file_path=str(local_path),
    target_file_path=remote_path,
    headers=auth_headers,  # <-- 手动传入认证 headers
)

请求

  1. 请确认 PR Add missing auth() calls to file upload/download methods #42 的改动是否真正包含在 v0.0.16 中
  2. 如果没有,请发布包含正确修复的 v0.0.17 版本
  3. 建议添加文件上传/下载的集成测试,防止类似问题再次发生

相关:Issue #41、PR #42

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions