问题描述
我们在使用 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 或接口层是否可以明确返回“已删除/无需删除”的成功语义?
问题描述
我们在使用 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 或接口层是否可以明确返回“已删除/无需删除”的成功语义?