Implement real-time profile retrieval and saving in simulation API
- Added a new endpoint to retrieve real-time agent profiles during simulation, allowing users to monitor progress without going through the SimulationManager. - Enhanced the profile generation process to support real-time saving of generated profiles to specified file formats (JSON for Reddit, CSV for Twitter). - Updated the simulation configuration generator to assign appropriate agents to initial posts based on their types, improving the relevance of generated content. - Improved error handling and logging for better traceability during profile generation and retrieval processes.
This commit is contained in:
@@ -803,6 +803,116 @@ def get_simulation_profiles(simulation_id: str):
|
||||
}), 500
|
||||
|
||||
|
||||
@simulation_bp.route('/<simulation_id>/profiles/realtime', methods=['GET'])
|
||||
def get_simulation_profiles_realtime(simulation_id: str):
|
||||
"""
|
||||
实时获取模拟的Agent Profile(用于在生成过程中实时查看进度)
|
||||
|
||||
与 /profiles 接口的区别:
|
||||
- 直接读取文件,不经过 SimulationManager
|
||||
- 适用于生成过程中的实时查看
|
||||
- 返回额外的元数据(如文件修改时间、是否正在生成等)
|
||||
|
||||
Query参数:
|
||||
platform: 平台类型(reddit/twitter,默认reddit)
|
||||
|
||||
返回:
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"simulation_id": "sim_xxxx",
|
||||
"platform": "reddit",
|
||||
"count": 15,
|
||||
"total_expected": 93, // 预期总数(如果有)
|
||||
"is_generating": true, // 是否正在生成
|
||||
"file_exists": true,
|
||||
"file_modified_at": "2025-12-04T18:20:00",
|
||||
"profiles": [...]
|
||||
}
|
||||
}
|
||||
"""
|
||||
import json
|
||||
import csv
|
||||
from datetime import datetime
|
||||
|
||||
try:
|
||||
platform = request.args.get('platform', 'reddit')
|
||||
|
||||
# 获取模拟目录
|
||||
sim_dir = os.path.join(Config.OASIS_SIMULATION_DATA_DIR, simulation_id)
|
||||
|
||||
if not os.path.exists(sim_dir):
|
||||
return jsonify({
|
||||
"success": False,
|
||||
"error": f"模拟不存在: {simulation_id}"
|
||||
}), 404
|
||||
|
||||
# 确定文件路径
|
||||
if platform == "reddit":
|
||||
profiles_file = os.path.join(sim_dir, "reddit_profiles.json")
|
||||
else:
|
||||
profiles_file = os.path.join(sim_dir, "twitter_profiles.csv")
|
||||
|
||||
# 检查文件是否存在
|
||||
file_exists = os.path.exists(profiles_file)
|
||||
profiles = []
|
||||
file_modified_at = None
|
||||
|
||||
if file_exists:
|
||||
# 获取文件修改时间
|
||||
file_stat = os.stat(profiles_file)
|
||||
file_modified_at = datetime.fromtimestamp(file_stat.st_mtime).isoformat()
|
||||
|
||||
try:
|
||||
if platform == "reddit":
|
||||
with open(profiles_file, 'r', encoding='utf-8') as f:
|
||||
profiles = json.load(f)
|
||||
else:
|
||||
with open(profiles_file, 'r', encoding='utf-8') as f:
|
||||
reader = csv.DictReader(f)
|
||||
profiles = list(reader)
|
||||
except (json.JSONDecodeError, Exception) as e:
|
||||
logger.warning(f"读取 profiles 文件失败(可能正在写入中): {e}")
|
||||
profiles = []
|
||||
|
||||
# 检查是否正在生成(通过 state.json 判断)
|
||||
is_generating = False
|
||||
total_expected = None
|
||||
|
||||
state_file = os.path.join(sim_dir, "state.json")
|
||||
if os.path.exists(state_file):
|
||||
try:
|
||||
with open(state_file, 'r', encoding='utf-8') as f:
|
||||
state_data = json.load(f)
|
||||
status = state_data.get("status", "")
|
||||
is_generating = status == "preparing"
|
||||
total_expected = state_data.get("entities_count")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return jsonify({
|
||||
"success": True,
|
||||
"data": {
|
||||
"simulation_id": simulation_id,
|
||||
"platform": platform,
|
||||
"count": len(profiles),
|
||||
"total_expected": total_expected,
|
||||
"is_generating": is_generating,
|
||||
"file_exists": file_exists,
|
||||
"file_modified_at": file_modified_at,
|
||||
"profiles": profiles
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"实时获取Profile失败: {str(e)}")
|
||||
return jsonify({
|
||||
"success": False,
|
||||
"error": str(e),
|
||||
"traceback": traceback.format_exc()
|
||||
}), 500
|
||||
|
||||
|
||||
@simulation_bp.route('/<simulation_id>/config', methods=['GET'])
|
||||
def get_simulation_config(simulation_id: str):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user