Skip to content

【bug】AgentRun Python SDK 中 list_sandboxes 仍能查到 TERMINATED 实例,但 delete_sandbox 删除同一 sandbox_id 时返回 sandbox not found #83

@Destiny-9527

Description

@Destiny-9527

问题描述

我们在使用 AgentRun Python SDK 做已终止实例清理时,发现控制面查询结果和删除接口行为不一致:

通过 list_sandboxes(status="TERMINATED") 仍然可以查到某个已终止 sandbox
但对同一个 sandbox_id 调用 delete_sandbox() 时,会失败并返回:
ClientError('Failed to stop sandbox: sandbox not found')
这会导致清理任务无法稳定工作,因为从列表接口看该实例仍然存在且应当可删,但删除接口实际上无法删除。

环境信息

SDK 版本:agentrun-sdk==0.0.27
Python 版本:3.12
使用场景:
通过 list_sandboxes(status="TERMINATED", template_name=..., template_type=...) 查询已终止实例
通过 delete_sandbox(sandbox_id) 清理实例
复现步骤

调用 list_sandboxes(status="TERMINATED")
确认返回列表中包含某个已终止实例,例如:
sandbox_id = "91d970881b8d4dcaa5636df64577545b--18ee62652b"
对同一个 sandbox_id 调用删除:
from app.core.config import get_agent_specs
from app.core.sandbox.client import AgentRunClient

sandbox_id = "91d970881b8d4dcaa5636df64577545b--18ee62652b"

for agent in get_agent_specs().values():
spec = getattr(agent, "sandbox_spec", None)
if spec is None or spec.backend_type != "agentrun":
continue
try:
client = AgentRunClient(spec)
client.delete_sandbox(sandbox_id)
print("deleted via", spec.agentrun_template_name)
break
except Exception as e:
print("failed via", spec.agentrun_template_name, repr(e))
实际结果

删除失败,错误如下:

failed via vpc-test-sandbox ClientError('Failed to stop sandbox: sandbox not found')
相关调用栈显示,SDK 删除路径走的是 data API:

File ".../agentrun/sandbox/client.py", line 765, in delete_sandbox
result = self.__sandbox_data_api.delete_sandbox(...)
...
ClientError: Failed to stop sandbox: sandbox not found
期望结果

以下任一行为都可以接受,但当前行为会导致清理任务难以处理:

对于仍然能被 list_sandboxes() 查到的 sandbox,delete_sandbox(sandbox_id) 应该删除成功
如果该 sandbox 实际已经被底层删除/不可访问,delete_sandbox() 应该具备幂等语义,返回成功而不是 sandbox not found
如果某个 sandbox 已经无法通过官方删除接口删除,那么 list_sandboxes() 不应继续返回它
补充分析

从 SDK 行为看,当前可能存在控制面与数据面状态不一致的问题:

list_sandboxes() 走的是控制面查询,仍能查到该 TERMINATED 实例
delete_sandbox() 走的是数据面删除,数据面已提示 sandbox not found
这会导致自动清理程序反复遇到“列表可见、删除失败”的假失败场景。

希望阿里云协助确认的问题

对于 TERMINATED 状态的 sandbox,出现“列表仍可见但删除时报 not found”是否属于预期行为?
delete_sandbox() 对已不存在的数据面实例,是否应该支持幂等删除?
对于已终止实例,是否有推荐使用的删除接口,而不是当前 SDK 的 delete_sandbox()?
控制面和数据面之间的状态同步机制是什么?是否存在已知延迟窗口?
如果某类 TERMINATED 实例本身不需要再删除,SDK 或接口层是否可以明确返回“已删除/无需删除”的成功语义?

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