@@ -535,7 +535,7 @@ const selectAgent = (agent, idx) => {
// 恢复该 Agent 的对话记录
chatHistory.value = chatHistoryCache.value[`agent_${idx}`] || []
- addLog(`选择对话对象: ${agent.username}`)
+ addLog(`Selected conversation target: ${agent.username}`)
}
const formatTime = (timestamp) => {
@@ -662,10 +662,10 @@ const sendMessage = async () => {
await sendToAgent(message)
}
} catch (err) {
- addLog(`发送失败: ${err.message}`)
+ addLog(`Send failed: ${err.message}`)
chatHistory.value.push({
role: 'assistant',
- content: `抱歉,发生了错误: ${err.message}`,
+ content: `Sorry, something went wrong: ${err.message}`,
timestamp: new Date().toISOString()
})
} finally {
@@ -677,7 +677,7 @@ const sendMessage = async () => {
}
const sendToReportAgent = async (message) => {
- addLog(`向 Report Agent 发送: ${message.substring(0, 50)}...`)
+ addLog(`Sending to Report Agent: ${message.substring(0, 50)}...`)
// Build chat history for API
const historyForApi = chatHistory.value
@@ -697,21 +697,21 @@ const sendToReportAgent = async (message) => {
if (res.success && res.data) {
chatHistory.value.push({
role: 'assistant',
- content: res.data.response || res.data.answer || '无响应',
+ content: res.data.response || res.data.answer || 'No response',
timestamp: new Date().toISOString()
})
- addLog('Report Agent 已回复')
+ addLog('Report Agent replied')
} else {
- throw new Error(res.error || '请求失败')
+ throw new Error(res.error || 'Request failed')
}
}
const sendToAgent = async (message) => {
if (!selectedAgent.value || selectedAgentIndex.value === null) {
- throw new Error('请先选择一个模拟个体')
+ throw new Error('Please choose a simulated individual first')
}
- addLog(`向 ${selectedAgent.value.username} 发送: ${message.substring(0, 50)}...`)
+ addLog(`Sending to ${selectedAgent.value.username}: ${message.substring(0, 50)}...`)
// Build prompt with chat history
let prompt = message
@@ -719,9 +719,9 @@ const sendToAgent = async (message) => {
const historyContext = chatHistory.value
.filter(msg => msg.content !== message)
.slice(-6)
- .map(msg => `${msg.role === 'user' ? '提问者' : '你'}:${msg.content}`)
+ .map(msg => `${msg.role === 'user' ? 'Interviewer' : 'You'}: ${msg.content}`)
.join('\n')
- prompt = `以下是我们之前的对话:\n${historyContext}\n\n现在我的新问题是:${message}`
+ prompt = `Here is our previous conversation:\n${historyContext}\n\nMy new question is: ${message}`
}
const res = await interviewAgents({
@@ -761,12 +761,12 @@ const sendToAgent = async (message) => {
content: responseContent,
timestamp: new Date().toISOString()
})
- addLog(`${selectedAgent.value.username} 已回复`)
+ addLog(`${selectedAgent.value.username} replied`)
} else {
- throw new Error('无响应数据')
+ throw new Error('No response data')
}
} else {
- throw new Error(res.error || '请求失败')
+ throw new Error(res.error || 'Request failed')
}
}
@@ -803,7 +803,7 @@ const submitSurvey = async () => {
if (selectedAgents.value.size === 0 || !surveyQuestion.value.trim()) return
isSurveying.value = true
- addLog(`发送问卷给 ${selectedAgents.value.size} 个对象...`)
+ addLog(`Sending a survey to ${selectedAgents.value.size} targets...`)
try {
const interviews = Array.from(selectedAgents.value).map(idx => ({
@@ -830,20 +830,20 @@ const submitSurvey = async () => {
const agent = profiles.value[agentIdx]
// 优先使用 reddit 平台回复,其次 twitter
- let responseContent = '无响应'
+ let responseContent = 'No response'
if (typeof resultsDict === 'object' && !Array.isArray(resultsDict)) {
const redditKey = `reddit_${agentIdx}`
const twitterKey = `twitter_${agentIdx}`
const agentResult = resultsDict[redditKey] || resultsDict[twitterKey]
if (agentResult) {
- responseContent = agentResult.response || agentResult.answer || '无响应'
+ responseContent = agentResult.response || agentResult.answer || 'No response'
}
} else if (Array.isArray(resultsDict)) {
// 兼容数组格式
const matchedResult = resultsDict.find(r => r.agent_id === agentIdx)
if (matchedResult) {
- responseContent = matchedResult.response || matchedResult.answer || '无响应'
+ responseContent = matchedResult.response || matchedResult.answer || 'No response'
}
}
@@ -857,12 +857,12 @@ const submitSurvey = async () => {
}
surveyResults.value = surveyResultsList
- addLog(`收到 ${surveyResults.value.length} 条回复`)
+ addLog(`Received ${surveyResults.value.length} responses`)
} else {
- throw new Error(res.error || '请求失败')
+ throw new Error(res.error || 'Request failed')
}
} catch (err) {
- addLog(`问卷发送失败: ${err.message}`)
+ addLog(`Survey failed: ${err.message}`)
} finally {
isSurveying.value = false
}
@@ -873,7 +873,7 @@ const loadReportData = async () => {
if (!props.reportId) return
try {
- addLog(`加载报告数据: ${props.reportId}`)
+ addLog(`Loading report data: ${props.reportId}`)
// Get report info
const reportRes = await getReport(props.reportId)
@@ -882,7 +882,7 @@ const loadReportData = async () => {
await loadAgentLogs()
}
} catch (err) {
- addLog(`加载报告失败: ${err.message}`)
+ addLog(`Failed to load report: ${err.message}`)
}
}
@@ -904,10 +904,10 @@ const loadAgentLogs = async () => {
}
})
- addLog('报告数据加载完成')
+ addLog('Report data loaded')
}
} catch (err) {
- addLog(`加载报告日志失败: ${err.message}`)
+ addLog(`Failed to load report logs: ${err.message}`)
}
}
@@ -918,10 +918,10 @@ const loadProfiles = async () => {
const res = await getSimulationProfilesRealtime(props.simulationId, 'reddit')
if (res.success && res.data) {
profiles.value = res.data.profiles || []
- addLog(`加载了 ${profiles.value.length} 个模拟个体`)
+ addLog(`Loaded ${profiles.value.length} simulated individuals`)
}
} catch (err) {
- addLog(`加载模拟个体失败: ${err.message}`)
+ addLog(`Failed to load simulated individuals: ${err.message}`)
}
}
@@ -935,7 +935,7 @@ const handleClickOutside = (e) => {
// Lifecycle
onMounted(() => {
- addLog('Step5 深度互动初始化')
+ addLog('Step5 deep interaction initialized')
loadReportData()
loadProfiles()
document.addEventListener('click', handleClickOutside)
diff --git a/frontend/src/store/pendingUpload.js b/frontend/src/store/pendingUpload.js
index 958c3d0a6..bdac77cad 100644
--- a/frontend/src/store/pendingUpload.js
+++ b/frontend/src/store/pendingUpload.js
@@ -1,6 +1,6 @@
/**
- * 临时存储待上传的文件和需求
- * 用于首页点击启动引擎后立即跳转,在Process页面再进行API调用
+ * Temporarily store files and requirements before upload
+ * Used when the home page immediately navigates to Process and performs the API call there
*/
import { reactive } from 'vue'
diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue
index afe01a0c4..5fa1cc94e 100644
--- a/frontend/src/views/Home.vue
+++ b/frontend/src/views/Home.vue
@@ -5,7 +5,7 @@
MIROFISH
@@ -15,21 +15,21 @@
- 简洁通用的群体智能引擎
- / v0.1-预览版
+ A lean, general-purpose collective intelligence engine
+ / v0.1-preview
- 上传任意报告
- 即刻推演未来
+ Upload Any Report
+ Simulate the Future Instantly
- 即使只有一段文字,MiroFish 也能基于其中的现实种子,全自动生成与之对应的至多百万级Agent构成的平行世界。通过上帝视角注入变量,在复杂的群体交互中寻找动态环境下的“局部最优解”
+ Even a single paragraph is enough for MiroFish to extract real-world seeds and automatically build a parallel world with up to millions of agents. Inject variables from a god's-eye view and search for a dynamic "local optimum" across complex collective interactions.
- 让未来在 Agent 群中预演,让决策在百战后胜出_
+ Let the future play out across agents, and let decisions win after many trials_
@@ -53,65 +53,65 @@
-
准备就绪
+
Ready
- 预测引擎待命中,可上传多份非结构化数据以初始化模拟序列
+ The prediction engine is standing by. Upload multiple unstructured files to initialize a simulation run.
-
低成本
-
常规模拟平均5$/次
+
Low Cost
+
Typical runs average about $5 each
-
高可用
-
最多百万级Agent模拟
+
High Scale
+
Simulate up to millions of agents
01
-
图谱构建
-
现实种子提取 & 个体与群体记忆注入 & GraphRAG构建
+
Graph Build
+
Seed extraction, individual and collective memory injection, and GraphRAG construction
02
-
环境搭建
-
实体关系抽取 & 人设生成 & 环境配置Agent注入仿真参数
+
Environment Setup
+
Entity and relationship extraction, persona generation, and runtime parameter injection
03
-
开始模拟
-
双平台并行模拟 & 自动解析预测需求 & 动态更新时序记忆
+
Run Simulation
+
Parallel dual-platform simulation, automatic prediction parsing, and live temporal memory updates
04
-
报告生成
-
ReportAgent拥有丰富的工具集与模拟后环境进行深度交互
+
Report Generation
+
Report Agent uses a rich toolset to investigate the post-simulation world
05
-
深度互动
-
与模拟世界中的任意一位进行对话 & 与ReportAgent进行对话
+
Deep Interaction
+
Talk with any simulated individual or continue with Report Agent
@@ -124,8 +124,8 @@
↑
-
拖拽文件上传
-
或点击浏览文件系统
+
Drag And Drop Files
+
or click to browse your files
@@ -164,23 +164,23 @@
- 输入参数
+ Input Parameters
@@ -191,8 +191,8 @@
@click="startSimulation"
:disabled="!canSubmit || loading"
>
-
启动引擎
-
初始化中...
+
Start Engine
+
Initializing...
→
diff --git a/frontend/src/views/InteractionView.vue b/frontend/src/views/InteractionView.vue
index b153590d7..c9761c0e0 100644
--- a/frontend/src/views/InteractionView.vue
+++ b/frontend/src/views/InteractionView.vue
@@ -15,7 +15,7 @@
:class="{ active: viewMode === mode }"
@click="viewMode = mode"
>
- {{ { graph: '图谱', split: '双栏', workbench: '工作台' }[mode] }}
+ {{ { graph: 'Graph', split: 'Split', workbench: 'Workbench' }[mode] }}
@@ -23,7 +23,7 @@
-
+
{
// --- Data Logic ---
const loadReportData = async () => {
try {
- addLog(`加载报告数据: ${currentReportId.value}`)
+ addLog(`Loading report data: ${currentReportId.value}`)
- // 获取 report 信息以获取 simulation_id
+ // Fetch report info to get the simulation_id
const reportRes = await getReport(currentReportId.value)
if (reportRes.success && reportRes.data) {
const reportData = reportRes.data
simulationId.value = reportData.simulation_id
if (simulationId.value) {
- // 获取 simulation 信息
+ // Fetch simulation info
const simRes = await getSimulation(simulationId.value)
if (simRes.success && simRes.data) {
const simData = simRes.data
- // 获取 project 信息
+ // Fetch project info
if (simData.project_id) {
const projRes = await getProject(simData.project_id)
if (projRes.success && projRes.data) {
projectData.value = projRes.data
- addLog(`项目加载成功: ${projRes.data.project_id}`)
+ addLog(`Project loaded successfully: ${projRes.data.project_id}`)
- // 获取 graph 数据
+ // Fetch graph data
if (projRes.data.graph_id) {
await loadGraph(projRes.data.graph_id)
}
@@ -170,10 +170,10 @@ const loadReportData = async () => {
}
}
} else {
- addLog(`获取报告信息失败: ${reportRes.error || '未知错误'}`)
+ addLog(`Failed to fetch report info: ${reportRes.error || 'Unknown error'}`)
}
} catch (err) {
- addLog(`加载异常: ${err.message}`)
+ addLog(`Load error: ${err.message}`)
}
}
@@ -184,10 +184,10 @@ const loadGraph = async (graphId) => {
const res = await getGraphData(graphId)
if (res.success) {
graphData.value = res.data
- addLog('图谱数据加载成功')
+ addLog('Graph data loaded successfully')
}
} catch (err) {
- addLog(`图谱加载失败: ${err.message}`)
+ addLog(`Failed to load graph data: ${err.message}`)
} finally {
graphLoading.value = false
}
@@ -208,7 +208,7 @@ watch(() => route.params.reportId, (newId) => {
}, { immediate: true })
onMounted(() => {
- addLog('InteractionView 初始化')
+ addLog('InteractionView initialized')
loadReportData()
})
diff --git a/frontend/src/views/MainView.vue b/frontend/src/views/MainView.vue
index 6ff299112..ff515621e 100644
--- a/frontend/src/views/MainView.vue
+++ b/frontend/src/views/MainView.vue
@@ -15,7 +15,7 @@
:class="{ active: viewMode === mode }"
@click="viewMode = mode"
>
- {{ { graph: '图谱', split: '双栏', workbench: '工作台' }[mode] }}
+ {{ { graph: 'Graph', split: 'Split', workbench: 'Workbench' }[mode] }}
@@ -48,7 +48,7 @@
-
+
-
+
{
const handleNextStep = (params = {}) => {
if (currentStep.value < 5) {
currentStep.value++
- addLog(`进入 Step ${currentStep.value}: ${stepNames[currentStep.value - 1]}`)
+ addLog(`Entering Step ${currentStep.value}: ${stepNames[currentStep.value - 1]}`)
- // 如果是从 Step 2 进入 Step 3,记录模拟轮数配置
+ // When moving from Step 2 to Step 3, log the round configuration
if (currentStep.value === 3 && params.maxRounds) {
- addLog(`自定义模拟轮数: ${params.maxRounds} 轮`)
+ addLog(`Custom simulation rounds: ${params.maxRounds}`)
}
}
}
@@ -171,7 +171,7 @@ const handleNextStep = (params = {}) => {
const handleGoBack = () => {
if (currentStep.value > 1) {
currentStep.value--
- addLog(`返回 Step ${currentStep.value}: ${stepNames[currentStep.value - 1]}`)
+ addLog(`Returning to Step ${currentStep.value}: ${stepNames[currentStep.value - 1]}`)
}
}
diff --git a/frontend/src/views/Process.vue b/frontend/src/views/Process.vue
index 2d2d3cc1a..74eeff9cb 100644
--- a/frontend/src/views/Process.vue
+++ b/frontend/src/views/Process.vue
@@ -7,7 +7,7 @@
STEP 01
-
图谱构建
+
Graph Build
@@ -23,20 +23,20 @@
@@ -189,8 +189,8 @@
- 等待本体生成
- 生成完成后将自动开始构建图谱
+ Waiting for ontology generation
+ Graph building will start automatically once ontology generation finishes
@@ -200,8 +200,8 @@
- 图谱构建中
- 数据即将显示...
+ Building graph
+ Data will appear shortly...