agentscope-ai / agentscope-ai/agentscope
[Bug]: Need expose `use_server_proxy` and `volumes` in OpenSandboxWorkspace / OpenSandboxWorkspaceManager
- Ngôn ngữ chính
- Python
- Star
- 31.5k
- Fork
- 3.5k
- Merge trung bình
- 1 ngày 23 giờ
- Pull request đã merge (30 ngày)
- 95
Mô tả
### Prerequisites
- [x] I have searched the existing [issues](https://github.com/agentscope-ai/agentscope/issues) and [discussions](https://github.com/agentscope-ai/agentscope/discussions), and this is not a duplicate.
- [x] This is a bug, not a usage question. (For questions, please use [Discussions](https://github.com/agentscope-ai/agentscope/discussions/new?category=general) instead.)
### Background / Description
### Problem
Two production requirements that the OpenSandbox workspace classes currently don't support:
**1. Cross-network access (`use_server_proxy`)**
When the client and the OpenSandbox server run on different machines, the SDK defaults to **direct** connections to sandbox containers on their dynamically allocated ports (40000–60000). These ports are unreachable — only the API server port (16399) is exposed. The SDK's `ConnectionConfig` already has `use_server_proxy: bool` to route all execd traffic through the API server, but `OpenSandboxWorkspace._connection_config()` doesn't expose it.
**2. Persistent storage (`volumes`)**
Sandboxes have a `timeout_seconds` lifetime. When a sandbox expires, all files inside `/workspace` are lost. The SDK's `Sandbox.create()` accepts `volumes: list[Volume]` (host bind-mount, PVC, OSSFS), but `OpenSandboxWorkspace._create_sandbox()` doesn't pass it.
### Proposed change
Add two optional keyword parameters to both `OpenSandboxWorkspace.__init__` and `OpenSandboxWorkspaceManager.__init__`:
| Parameter | Type | Default | SDK field |
|-----------|------|---------|-----------|
| `use_server_proxy` | `bool` | `False` | `ConnectionConfig.use_server_proxy` |
| `volumes` | `list[Volume] \| None` | `None` | `Sandbox.create(volumes=...)` |
**`OpenSandboxWorkspace._connection_config()`** — add `use_server_proxy`:
```python
def _connection_config(self) -> ConnectionConfig:
kwargs: dict = {"protocol": self.protocol}
if self.api_key:
kwargs["api_key"] = self.api_key
if self.domain:
kwargs["domain"] = self.domain
if self.request_timeout_seconds is not None:
kwargs["request_timeout"] = timedelta(seconds=self.request_timeout_seconds)
kwargs["use_server_proxy"] = self.use_server_proxy # <-- new
return ConnectionConfig(**kwargs)
```
**`OpenSandboxWorkspace._create_sandbox()`** — add `volumes`:
```python
async def _create_sandbox(self) -> Sandbox:
kwargs = { ... }
# ... existing env / resource / entrypoint / network_policy handling ...
if self.volumes:
kwargs["volumes"] = self.volumes # <-- new
return await Sandbox.create(**kwargs)
```
### Environment
- agentscope 2.0.5
- OpenSandbox server 0.2.0
### Error Messages
```shell
2026/07/29 13:59:22 | MainProcess[33364]:MainThread[26284] | [_trace.py:87 - _trace]-[DEBUG] - connect_tcp.started host='172.xx.x.xx' port=58525 local_address=None timeout=600.0 socket_options=None
2026/07/29 13:59:24 | MainProcess[33364]:MainThread[26284] | [_trace.py:87 - _trace]-[DEBUG] - connect_tcp.failed exception=ConnectError(OSError('All connection attempts failed'))
2026/07/29 13:59:24 | MainProcess[33364]:MainThread[26284] | [filesystem_adapter.py:271 - filesystem_adapter]-[ERROR] - Failed to write 1 files
```
### Steps to Reproduce
**Setup**: OpenSandbox server runs on `172.xx.x.xx:16399`. Client runs on a different machine (separate network segment).
**Server config** (`sandbox.toml`):
```toml
[server]
host = "0.0.0.0"
port = 16399
api_key = "sk-example"
[runtime]
type = "docker"
[ingress]
mode = "direct"
```
**Client code**:
```python
import asyncio
from agentscope.app.workspace_manager import OpenSandboxWorkspaceManager
async def main():
manager = OpenSandboxWorkspaceManager(
api_key="sk-example",
domain="172.xx.x.xx:16399",
)
ws = await manager.get_workspace(
user_id="user-1",
agent_id="agent-1",
session_id="session-1",
)
print(f"sandbox_id={ws.sandbox_id}")
# The next tool call (e.g. Bash) triggers filesystem write via execd
# → httpx.ConnectError to port 58525
asyncio.run(main())
```
**Output**:
```
INFO | Initialize workspace (id=...) from OpenSandboxWorkspace ...
DEBUG | connect_tcp.started host='172.xx.x.xx' port=16399 # API server: OK
DEBUG | connect_tcp.started host='172.xx.x.xx' port=58525 # execd direct: FAIL
DEBUG | connect_tcp.failed exception=ConnectError('All connection attempts failed')
ERROR | filesystem_adapter.py:271 - Failed to write 1 files
httpx.ConnectError: All connection attempts failed
```
**Expected**: `use_server_proxy=True` would route the execd request through port 16399 instead of connecting directly to 58525.
### Environment
- AgentScope Version:2.0.5
- Python Version:3.12.0
- OS:ubuntu 22.04
Hướng dẫn đóng góp
Đánh giá
Issue này chưa được đánh giá.