Source code for agentsociety2.backend.routers.prefill_params

"""预填充参数查询API路由(只读)

关联文件:
- @packages/agentsociety2/agentsociety2/backend/app.py - 主应用,注册此路由 (/api/v1/prefill-params)
- @extension/src/prefillParamsViewProvider.ts - VSCode插件前端调用此API
- @extension/src/webview/prefillParams/ - 前端展示组件

读取文件:
- {workspace}/.agentsociety/prefill_params.json - 预填充参数配置
"""

from __future__ import annotations

import json
from typing import Dict, Any, Literal

from fastapi import APIRouter, Query, HTTPException
from fastapi import Path as PathParam

from agentsociety2.backend.path_security import (
    resolve_under_root,
    resolve_workspace_root,
)
from agentsociety2.logger import get_logger

logger = get_logger()

router = APIRouter(prefix="/api/v1/prefill-params", tags=["prefill-params"])


def _load_prefill_params_file(workspace_path: str) -> Dict[str, Any]:
    """加载全局预填充参数文件"""
    workspace = resolve_workspace_root(workspace_path)
    prefill_file = resolve_under_root(workspace, ".agentsociety", "prefill_params.json")

    if not prefill_file.is_file():
        return {"version": "1.0", "env_modules": {}, "agents": {}}

    try:
        content = prefill_file.read_text(encoding="utf-8")
        return json.loads(content)
    except Exception as e:
        logger.error(f"Failed to load prefill params file: {e}", exc_info=True)
        raise HTTPException(
            status_code=500, detail=f"Failed to load prefill params file: {e!s}"
        ) from None


[docs] @router.get("") async def get_prefill_params( workspace_path: str = Query(..., description="工作区路径"), ) -> Dict[str, Any]: """ 获取全局预填充参数 返回工作区中所有类(Agent和环境模块)的预填充参数配置。 :param workspace_path: 工作区根目录路径 :returns: Dict[str, Any]: 预填充参数配置,包含: - success: 是否成功 - data: 参数数据,结构为: - version: 配置版本 - env_modules: 环境模块预填充参数字典 - agents: Agent预填充参数字典 :raises HTTPException: 500 - 读取配置文件失败 Note: 如果配置文件不存在,返回空配置结构。 """ try: prefill_params = _load_prefill_params_file(workspace_path) return {"success": True, "data": prefill_params} except HTTPException: raise except Exception as e: logger.error(f"Failed to get prefill params: {e}", exc_info=True) raise HTTPException( status_code=500, detail=f"Failed to get prefill params: {e!s}" ) from None
[docs] @router.get("/{class_kind}/{class_name}") async def get_class_prefill_params( class_kind: Literal["env_module", "agent"] = PathParam( ..., description="类类型:env_module 或 agent" ), class_name: str = PathParam( ..., description="类名,如 mobility_space, basic_agent" ), workspace_path: str = Query(..., description="工作区路径"), ) -> Dict[str, Any]: """ 获取特定类的预填充参数 返回指定类(Agent或环境模块)的预填充参数配置。 :param class_kind: 类类型,可选值: - env_module: 环境模块 - agent: Agent类 :param class_name: 类名,如 mobility_space, basic_agent 等 :param workspace_path: 工作区根目录路径 :returns: Dict[str, Any]: 类的预填充参数,包含: - success: 是否成功 - class_kind: 类类型 - class_name: 类名 - params: 该类的预填充参数字典(如无配置则为空字典) :raises HTTPException: 500 - 读取配置文件失败 Example: GET /api/v1/prefill-params/env_module/mobility_space?workspace_path=/path/to/workspace """ try: prefill_params = _load_prefill_params_file(workspace_path) # 根据class_kind选择对应的键 params_key = "env_modules" if class_kind == "env_module" else "agents" class_params = prefill_params.get(params_key, {}).get(class_name, {}) return { "success": True, "class_kind": class_kind, "class_name": class_name, "params": class_params, } except HTTPException: raise except Exception as e: logger.error(f"Failed to get class prefill params: {e}", exc_info=True) raise HTTPException( status_code=500, detail=f"Failed to get class prefill params: {e!s}" ) from None