Studio: 增量/覆盖保存、节点切换与绑定编辑弹窗

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-31 23:28:49 +08:00
parent 0f50c98cf3
commit 71e673a2ed
13 changed files with 1504 additions and 294 deletions

View File

@@ -12,10 +12,12 @@ from models.studio_models import (
RenameRunRequest,
RunMessageRequest,
RunRerollRequest,
SaveRunRequest,
StudioProject,
StudioProjectSummary,
StudioRun,
StudioRunSummary,
SwitchRunNodeRequest,
UpdateStudioProjectRequest,
WorkflowTemplateSummary,
WorkflowVariablesResponse,
@@ -175,7 +177,7 @@ async def advance_studio_run(
):
try:
return studio_run_service.advance_run(
project_id, run_id, display_params=req.displayParams
project_id, run_id, display_params=req.displayParams, save_mode=req.saveMode
)
except FileNotFoundError as e:
raise HTTPException(status_code=404, detail=str(e))
@@ -190,6 +192,40 @@ async def advance_studio_run(
raise HTTPException(status_code=500, detail=str(e))
@router.post("/projects/{project_id}/runs/{run_id}/save", response_model=StudioRun)
async def save_studio_run(
project_id: str, run_id: str, req: SaveRunRequest
):
try:
return studio_run_service.save_run(project_id, run_id, req.mode)
except FileNotFoundError as e:
raise HTTPException(status_code=404, detail=str(e))
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
logger.error(
"Failed to save studio run %s/%s: %s", project_id, run_id, e
)
raise HTTPException(status_code=500, detail=str(e))
@router.post("/projects/{project_id}/runs/{run_id}/switch-node", response_model=StudioRun)
async def switch_studio_run_node(
project_id: str, run_id: str, req: SwitchRunNodeRequest
):
try:
return studio_run_service.switch_run_node(project_id, run_id, req.nodeId)
except FileNotFoundError as e:
raise HTTPException(status_code=404, detail=str(e))
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
logger.error(
"Failed to switch studio run node %s/%s: %s", project_id, run_id, e
)
raise HTTPException(status_code=500, detail=str(e))
@router.post("/projects/{project_id}/runs/{run_id}/message")
async def send_studio_run_message(
project_id: str, run_id: str, req: RunMessageRequest