修改
This commit is contained in:
+55
-1
@@ -233,12 +233,41 @@ class JupyterRuntimeSession:
|
||||
'persisted_at': time.time(),
|
||||
}
|
||||
|
||||
@property
|
||||
def chat_workspace_root(self) -> str:
|
||||
"""Per-user-per-chat root on shared NFS so the SFT training pod
|
||||
(which doesn't mount the jupyter pod's private workspace) can read
|
||||
and write the same artifacts. Layout:
|
||||
/mnt/wangsenhao/autoresearch-zk-users/<account_id>/<session_id>/"""
|
||||
account_part = sanitize_remote_path_part(self.binding.account_id)
|
||||
session_part = sanitize_remote_path_part(self.binding.session_id)
|
||||
return (
|
||||
f'/mnt/wangsenhao/autoresearch-zk-users/'
|
||||
f'{account_part}/{session_part}'
|
||||
)
|
||||
|
||||
def bootstrap_workspace(
|
||||
self,
|
||||
*,
|
||||
timeout_seconds: float = 20.0,
|
||||
project_root: Path | None = None,
|
||||
) -> None:
|
||||
chat_root = self.chat_workspace_root
|
||||
nfs_users_root = '/mnt/wangsenhao/autoresearch-zk-users'
|
||||
probe = self.run_command(
|
||||
(
|
||||
f'mkdir -p {shlex.quote(nfs_users_root)} && '
|
||||
f'touch {shlex.quote(nfs_users_root)}/.write_probe && '
|
||||
f'rm -f {shlex.quote(nfs_users_root)}/.write_probe'
|
||||
),
|
||||
timeout_seconds=timeout_seconds,
|
||||
max_output_chars=2000,
|
||||
)
|
||||
if probe.exit_code != 0:
|
||||
raise JupyterRuntimeError(
|
||||
'远端 jupyter pod 未挂载 /mnt/wangsenhao 或不可写:'
|
||||
+ (probe.stdout.strip() or probe.stderr.strip() or 'unknown error')
|
||||
)
|
||||
result = self.run_command(
|
||||
(
|
||||
'mkdir -p '
|
||||
@@ -247,7 +276,10 @@ class JupyterRuntimeSession:
|
||||
f'{shlex.quote(self.binding.workspace_cwd)}/scratchpad '
|
||||
f'{shlex.quote(self.binding.workspace_root)}/.runtime/uploads '
|
||||
f'{shlex.quote(self.binding.workspace_root)}/runtime_uploads '
|
||||
f'{shlex.quote(self.account_runtime_root)}/python'
|
||||
f'{shlex.quote(self.account_runtime_root)}/python '
|
||||
f'{shlex.quote(chat_root)}/results '
|
||||
f'{shlex.quote(chat_root)}/sft_output '
|
||||
f'{shlex.quote(chat_root)}/scripts'
|
||||
),
|
||||
timeout_seconds=timeout_seconds,
|
||||
max_output_chars=4000,
|
||||
@@ -259,6 +291,27 @@ class JupyterRuntimeSession:
|
||||
self.ensure_python_environment(timeout_seconds=max(timeout_seconds, 300.0))
|
||||
if project_root is not None:
|
||||
self.sync_runtime_bundle(project_root, timeout_seconds=max(timeout_seconds, 180.0))
|
||||
self._sync_chat_workspace_scripts(timeout_seconds=timeout_seconds)
|
||||
|
||||
def _sync_chat_workspace_scripts(self, *, timeout_seconds: float = 20.0) -> None:
|
||||
if not self.skills_root:
|
||||
return
|
||||
chat_root = self.chat_workspace_root
|
||||
src = f'{self.skills_root}/model-iteration/scripts/prepare_and_train_sft.py'
|
||||
dst = f'{chat_root}/scripts/prepare_and_train_sft.py'
|
||||
result = self.run_command(
|
||||
(
|
||||
f'if [ -f {shlex.quote(src)} ]; then '
|
||||
f'cp {shlex.quote(src)} {shlex.quote(dst)}; '
|
||||
f'fi'
|
||||
),
|
||||
timeout_seconds=timeout_seconds,
|
||||
max_output_chars=2000,
|
||||
)
|
||||
if result.exit_code != 0:
|
||||
raise JupyterRuntimeError(
|
||||
result.stdout.strip() or 'Unable to sync chat workspace SFT script.'
|
||||
)
|
||||
|
||||
def to_dict(self) -> dict[str, Any]:
|
||||
payload = self.binding.to_dict()
|
||||
@@ -835,6 +888,7 @@ print(f"{'appended' if MODE == 'a' else 'wrote'} {target} ({len(content)} chars)
|
||||
'ZK_AGENT_OUTPUT': f'{self.binding.workspace_cwd}/output',
|
||||
'ZK_AGENT_SCRATCHPAD': f'{self.binding.workspace_cwd}/scratchpad',
|
||||
'ZK_AGENT_PYTHON_ENV': self.python_env_path,
|
||||
'AUTORESEARCH_CHAT_ROOT': self.chat_workspace_root,
|
||||
}
|
||||
if self.platform_root:
|
||||
exports['ZK_AGENT_PLATFORM_ROOT'] = self.platform_root
|
||||
|
||||
Reference in New Issue
Block a user