diff --git a/pipeline_service/agent_loop_v2.py b/pipeline_service/agent_loop_v2.py index 2661fe0..4e05c54 100644 --- a/pipeline_service/agent_loop_v2.py +++ b/pipeline_service/agent_loop_v2.py @@ -25,6 +25,24 @@ from typing import AsyncGenerator, Dict, List, Optional logger = logging.getLogger("pipeline.agent_executor") + +async def _get_param(sor, name: str, default: str = "") -> str: + """从 appbase params 表读参数(params_name → params_value),带默认值兜底。 + + params 表由 appbase 模块提供,用于存系统级可配置参数,避免硬编码。 + 默认值仅作兜底,真正值以 params 表为准(可动态维护)。 + """ + try: + recs = await sor.sqlExe( + "SELECT params_value FROM params WHERE params_name=${n}$ LIMIT 1", + {"n": name}) + if recs: + return getattr(recs[0], "params_value", "") or default + except Exception: + pass + return default + + # ── 默认工具定义(在 pipeline-core 未加载时使用)── _BUILTIN_ASK_USER_SCHEMA = { @@ -667,10 +685,11 @@ class AgentExecutor: if _u: org_id = getattr(_u[0], "orgid", "0") or "0" - # 项目专属工作空间目录(与 workspace_tree.dspy 的 workspace_base 一致) + # 项目专属工作空间目录(workspace_base 从 appbase params 表读,可动态配置) # 不设置 workspace_dir 会导致 _resolve_workspace 回退到 ~/pipeline_ws/default, # 所有项目共用同一目录,设计文档/代码互相覆盖。 - workspace_dir = os.path.join("/d/pipeline/workspaces", str(org_id), name) + workspace_base = await _get_param(sor, "workspace_base", "/d/pipeline/workspaces") + workspace_dir = os.path.join(workspace_base, str(org_id), name) os.makedirs(workspace_dir, exist_ok=True) pid_val = getID()