-
详细人设背景
+
Detailed Persona Background
- 事件全景经历
- 在此事件中的完整行为轨迹
+ Event Panorama
+ Complete behavioral trajectory in this event
- 行为模式侧写
- 经验总结与行事风格偏好
+ Behavioral Profile
+ Experience summary and behavioral preferences
- 独特记忆印记
- 基于现实种子形成的记忆
+ Unique Memory Imprint
+ Memories formed from real-world seeds
- 社会关系网络
- 个体链接与交互图谱
+ Social Network
+ Individual connections and interaction graph
@@ -680,7 +680,7 @@ watch(currentStage, (newStage) => {
phase.value = 2
// 进入配置生成阶段,开始轮询配置
if (!configTimer) {
- addLog('开始生成双平台模拟配置...')
+ addLog('Generating dual-platform simulation config...')
startConfigPolling()
}
} else if (newStage === '准备模拟脚本' || newStage === 'copying_scripts') {
@@ -745,10 +745,10 @@ const handleStartSimulation = () => {
if (useCustomRounds.value) {
// 用户自定义轮数,传递 max_rounds 参数
params.maxRounds = customMaxRounds.value
- addLog(`开始模拟,自定义轮数: ${customMaxRounds.value} 轮`)
+ addLog(`Starting simulation, custom rounds: ${customMaxRounds.value}`)
} else {
// 用户选择保持自动生成的轮数,不传递 max_rounds 参数
- addLog(`开始模拟,使用自动配置轮数: ${autoGeneratedRounds.value} 轮`)
+ addLog(`Starting simulation, auto-configured rounds: ${autoGeneratedRounds.value}`)
}
emit('next-step', params)
@@ -768,15 +768,15 @@ const selectProfile = (profile) => {
// 自动开始准备模拟
const startPrepareSimulation = async () => {
if (!props.simulationId) {
- addLog('错误:缺少 simulationId')
+ addLog('Error: missing simulationId')
emit('update-status', 'error')
return
}
// 标记第一步完成,开始第二步
phase.value = 1
- addLog(`模拟实例已创建: ${props.simulationId}`)
- addLog('正在准备模拟环境...')
+ addLog(`Simulation instance created: ${props.simulationId}`)
+ addLog('Preparing simulation environment...')
emit('update-status', 'processing')
try {
@@ -788,35 +788,35 @@ const startPrepareSimulation = async () => {
if (res.success && res.data) {
if (res.data.already_prepared) {
- addLog('检测到已有完成的准备工作,直接使用')
+ addLog('Existing preparation detected, using it directly')
await loadPreparedData()
return
}
taskId.value = res.data.task_id
- addLog(`准备任务已启动`)
+ addLog(`Preparation task started`)
addLog(` └─ Task ID: ${res.data.task_id}`)
// 立即设置预期Agent总数(从prepare接口返回值获取)
if (res.data.expected_entities_count) {
expectedTotal.value = res.data.expected_entities_count
- addLog(`从Zep图谱读取到 ${res.data.expected_entities_count} 个实体`)
+ addLog(`Read ${res.data.expected_entities_count} entities from Zep graph`)
if (res.data.entity_types && res.data.entity_types.length > 0) {
- addLog(` └─ 实体类型: ${res.data.entity_types.join(', ')}`)
+ addLog(` └─ Entity types: ${res.data.entity_types.join(', ')}`)
}
}
- addLog('开始轮询准备进度...')
+ addLog('Polling preparation progress...')
// 开始轮询进度
startPolling()
// 开始实时获取 Profiles
startProfilesPolling()
} else {
- addLog(`准备失败: ${res.error || '未知错误'}`)
+ addLog(`Preparation failed: ${res.error || 'Unknown error'}`)
emit('update-status', 'error')
}
} catch (err) {
- addLog(`准备异常: ${err.message}`)
+ addLog(`Preparation error: ${err.message}`)
emit('update-status', 'error')
}
}
@@ -890,12 +890,12 @@ const pollPrepareStatus = async () => {
// 检查是否完成
if (data.status === 'completed' || data.status === 'ready' || data.already_prepared) {
- addLog('✓ 准备工作已完成')
+ addLog('✓ Preparation complete')
stopPolling()
stopProfilesPolling()
await loadPreparedData()
} else if (data.status === 'failed') {
- addLog(`✗ 准备失败: ${data.error || '未知错误'}`)
+ addLog(`✗ Preparation failed: ${data.error || 'Unknown error'}`)
stopPolling()
stopProfilesPolling()
}
@@ -934,13 +934,13 @@ const fetchProfilesRealtime = async () => {
const latestProfile = profiles.value[currentCount - 1]
const profileName = latestProfile?.name || latestProfile?.username || `Agent_${currentCount}`
if (currentCount === 1) {
- addLog(`开始生成Agent人设...`)
+ addLog(`Generating agent personas...`)
}
- addLog(`→ Agent人设 ${currentCount}/${total}: ${profileName} (${latestProfile?.profession || '未知职业'})`)
+ addLog(`→ Agent persona ${currentCount}/${total}: ${profileName} (${latestProfile?.profession || 'Unknown'})`)
// 如果全部生成完成
if (expectedTotal.value && currentCount >= expectedTotal.value) {
- addLog(`✓ 全部 ${currentCount} 个Agent人设生成完成`)
+ addLog(`✓ All ${currentCount} agent personas generated`)
}
}
}
@@ -974,41 +974,41 @@ const fetchConfigRealtime = async () => {
if (data.generation_stage && data.generation_stage !== lastLoggedConfigStage) {
lastLoggedConfigStage = data.generation_stage
if (data.generation_stage === 'generating_profiles') {
- addLog('正在生成Agent人设配置...')
+ addLog('Generating agent persona configs...')
} else if (data.generation_stage === 'generating_config') {
- addLog('正在调用LLM生成模拟配置参数...')
+ addLog('Calling LLM to generate simulation config parameters...')
}
}
// 如果配置已生成
if (data.config_generated && data.config) {
simulationConfig.value = data.config
- addLog('✓ 模拟配置生成完成')
+ addLog('✓ Simulation config generated')
// 显示详细配置摘要
if (data.summary) {
- addLog(` ├─ Agent数量: ${data.summary.total_agents}个`)
- addLog(` ├─ 模拟时长: ${data.summary.simulation_hours}小时`)
- addLog(` ├─ 初始帖子: ${data.summary.initial_posts_count}条`)
- addLog(` ├─ 热点话题: ${data.summary.hot_topics_count}个`)
- addLog(` └─ 平台配置: Twitter ${data.summary.has_twitter_config ? '✓' : '✗'}, Reddit ${data.summary.has_reddit_config ? '✓' : '✗'}`)
+ addLog(` ├─ Agents: ${data.summary.total_agents}`)
+ addLog(` ├─ Duration: ${data.summary.simulation_hours} hours`)
+ addLog(` ├─ Initial posts: ${data.summary.initial_posts_count}`)
+ addLog(` ├─ Trending topics: ${data.summary.hot_topics_count}`)
+ addLog(` └─ Platform config: Twitter ${data.summary.has_twitter_config ? '✓' : '✗'}, Reddit ${data.summary.has_reddit_config ? '✓' : '✗'}`)
}
// 显示时间配置详情
if (data.config.time_config) {
const tc = data.config.time_config
- addLog(`时间配置: 每轮${tc.minutes_per_round}分钟, 共${Math.floor((tc.total_simulation_hours * 60) / tc.minutes_per_round)}轮`)
+ addLog(`Time config: ${tc.minutes_per_round} min/round, ${Math.floor((tc.total_simulation_hours * 60) / tc.minutes_per_round)} total rounds`)
}
// 显示事件配置
if (data.config.event_config?.narrative_direction) {
const narrative = data.config.event_config.narrative_direction
- addLog(`叙事方向: ${narrative.length > 50 ? narrative.substring(0, 50) + '...' : narrative}`)
+ addLog(`Narrative: ${narrative.length > 50 ? narrative.substring(0, 50) + '...' : narrative}`)
}
stopConfigPolling()
phase.value = 4
- addLog('✓ 环境搭建完成,可以开始模拟')
+ addLog('✓ Environment setup complete, ready to simulate')
emit('update-status', 'completed')
}
}
@@ -1019,11 +1019,11 @@ const fetchConfigRealtime = async () => {
const loadPreparedData = async () => {
phase.value = 2
- addLog('正在加载已有配置数据...')
+ addLog('Loading existing config data...')
// 最后获取一次 Profiles
await fetchProfilesRealtime()
- addLog(`已加载 ${profiles.value.length} 个Agent人设`)
+ addLog(`Loaded ${profiles.value.length} agent personas`)
// 获取配置(使用实时接口)
try {
@@ -1031,26 +1031,26 @@ const loadPreparedData = async () => {
if (res.success && res.data) {
if (res.data.config_generated && res.data.config) {
simulationConfig.value = res.data.config
- addLog('✓ 模拟配置加载成功')
+ addLog('✓ Simulation config loaded')
// 显示详细配置摘要
if (res.data.summary) {
- addLog(` ├─ Agent数量: ${res.data.summary.total_agents}个`)
- addLog(` ├─ 模拟时长: ${res.data.summary.simulation_hours}小时`)
- addLog(` └─ 初始帖子: ${res.data.summary.initial_posts_count}条`)
+ addLog(` ├─ Agents: ${res.data.summary.total_agents}`)
+ addLog(` ├─ Duration: ${res.data.summary.simulation_hours} hours`)
+ addLog(` └─ Initial posts: ${res.data.summary.initial_posts_count}`)
}
- addLog('✓ 环境搭建完成,可以开始模拟')
+ addLog('✓ Environment setup complete, ready to simulate')
phase.value = 4
emit('update-status', 'completed')
} else {
// 配置尚未生成,开始轮询
- addLog('配置生成中,开始轮询等待...')
+ addLog('Config generation in progress, polling...')
startConfigPolling()
}
}
} catch (err) {
- addLog(`加载配置失败: ${err.message}`)
+ addLog(`Failed to load config: ${err.message}`)
emit('update-status', 'error')
}
}
@@ -1068,7 +1068,7 @@ watch(() => props.systemLogs?.length, () => {
onMounted(() => {
// 自动开始准备流程
if (props.simulationId) {
- addLog('Step2 环境搭建初始化')
+ addLog('Step2 environment setup initialized')
startPrepareSimulation()
}
})
diff --git a/frontend/src/components/Step3Simulation.vue b/frontend/src/components/Step3Simulation.vue
index 74d0e1e..df422c5 100644
--- a/frontend/src/components/Step3Simulation.vue
+++ b/frontend/src/components/Step3Simulation.vue
@@ -97,7 +97,7 @@
@click="handleNextStep"
>
- {{ isGeneratingReport ? '启动中...' : '开始生成结果报告' }}
+ {{ isGeneratingReport ? 'Starting...' : 'Generate Report' }}
→
@@ -379,7 +379,7 @@ const resetAllState = () => {
// 启动模拟
const doStartSimulation = async () => {
if (!props.simulationId) {
- addLog('错误:缺少 simulationId')
+ addLog('Error: missing simulationId')
return
}
@@ -388,7 +388,7 @@ const doStartSimulation = async () => {
isStarting.value = true
startError.value = null
- addLog('正在启动双平台并行模拟...')
+ addLog('Starting dual-platform parallel simulation...')
emit('update-status', 'processing')
try {
@@ -401,18 +401,18 @@ const doStartSimulation = async () => {
if (props.maxRounds) {
params.max_rounds = props.maxRounds
- addLog(`设置最大模拟轮数: ${props.maxRounds}`)
+ addLog(`Max simulation rounds set to: ${props.maxRounds}`)
}
- addLog('已开启动态图谱更新模式')
+ addLog('Dynamic graph update mode enabled')
const res = await startSimulation(params)
if (res.success && res.data) {
if (res.data.force_restarted) {
- addLog('✓ 已清理旧的模拟日志,重新开始模拟')
+ addLog('✓ Old simulation logs cleared, restarting simulation')
}
- addLog('✓ 模拟引擎启动成功')
+ addLog('✓ Simulation engine started successfully')
addLog(` ├─ PID: ${res.data.process_pid || '-'}`)
phase.value = 1
@@ -421,13 +421,13 @@ const doStartSimulation = async () => {
startStatusPolling()
startDetailPolling()
} else {
- startError.value = res.error || '启动失败'
- addLog(`✗ 启动失败: ${res.error || '未知错误'}`)
+ startError.value = res.error || 'Start failed'
+ addLog(`✗ Start failed: ${res.error || 'Unknown error'}`)
emit('update-status', 'error')
}
} catch (err) {
startError.value = err.message
- addLog(`✗ 启动异常: ${err.message}`)
+ addLog(`✗ Start error: ${err.message}`)
emit('update-status', 'error')
} finally {
isStarting.value = false
@@ -439,21 +439,21 @@ const handleStopSimulation = async () => {
if (!props.simulationId) return
isStopping.value = true
- addLog('正在停止模拟...')
+ addLog('Stopping simulation...')
try {
const res = await stopSimulation({ simulation_id: props.simulationId })
if (res.success) {
- addLog('✓ 模拟已停止')
+ addLog('✓ Simulation stopped')
phase.value = 2
stopPolling()
emit('update-status', 'completed')
} else {
- addLog(`停止失败: ${res.error || '未知错误'}`)
+ addLog(`Stop failed: ${res.error || 'Unknown error'}`)
}
} catch (err) {
- addLog(`停止异常: ${err.message}`)
+ addLog(`Stop error: ${err.message}`)
} finally {
isStopping.value = false
}
@@ -517,9 +517,9 @@ const fetchRunStatus = async () => {
if (isCompleted || platformsCompleted) {
if (platformsCompleted && !isCompleted) {
- addLog('✓ 检测到所有平台模拟已结束')
+ addLog('✓ All platform simulations completed')
}
- addLog('✓ 模拟已完成')
+ addLog('✓ Simulation complete')
phase.value = 2
stopPolling()
emit('update-status', 'completed')
@@ -640,17 +640,17 @@ const formatActionTime = (timestamp) => {
const handleNextStep = async () => {
if (!props.simulationId) {
- addLog('错误:缺少 simulationId')
+ addLog('Error: missing simulationId')
return
}
if (isGeneratingReport.value) {
- addLog('报告生成请求已发送,请稍候...')
+ addLog('Report generation request sent, please wait...')
return
}
isGeneratingReport.value = true
- addLog('正在启动报告生成...')
+ addLog('Starting report generation...')
try {
const res = await generateReport({
@@ -660,16 +660,16 @@ const handleNextStep = async () => {
if (res.success && res.data) {
const reportId = res.data.report_id
- addLog(`✓ 报告生成任务已启动: ${reportId}`)
+ addLog(`✓ Report generation started: ${reportId}`)
// 跳转到报告页面
router.push({ name: 'Report', params: { reportId } })
} else {
- addLog(`✗ 启动报告生成失败: ${res.error || '未知错误'}`)
+ addLog(`✗ Failed to start report generation: ${res.error || 'Unknown error'}`)
isGeneratingReport.value = false
}
} catch (err) {
- addLog(`✗ 启动报告生成异常: ${err.message}`)
+ addLog(`✗ Report generation error: ${err.message}`)
isGeneratingReport.value = false
}
}
@@ -685,7 +685,7 @@ watch(() => props.systemLogs?.length, () => {
})
onMounted(() => {
- addLog('Step3 模拟运行初始化')
+ addLog('Step3 simulation run initialized')
if (props.simulationId) {
doStartSimulation()
}
diff --git a/frontend/src/components/Step4Report.vue b/frontend/src/components/Step4Report.vue
index 22f2bdc..f70417d 100644
--- a/frontend/src/components/Step4Report.vue
+++ b/frontend/src/components/Step4Report.vue
@@ -58,7 +58,7 @@