本项目目录为 MiroFish-Optimize,用于在保留原始 MiroFish 工作流的基础上,把 图谱/记忆/向量存储本地化,并提升在真实使用中的可运行性与稳定性。
- 上游项目:
https://github.com/666ghj/MiroFish - 上游核心依赖:OASIS 模拟引擎(用于社媒多智能体模拟)
- 本优化版目标:允许继续调用云端 LLM(推理/抽取),但把 存储 全部落到本地(Neo4j + Qdrant),避免 Zep 免费版 429、并让“历史项目/历史图谱”可持续累积。
- 新增
GRAPH_BACKEND:local:Neo4j 存图谱(节点/边/Chunk 关联),Qdrant 存向量(Chunk embeddings)zep:继续使用上游 Zep Cloud(需要ZEP_API_KEY,可能遇到 429)
- 新增
VECTOR_BACKEND:qdrant:启用向量检索none:关闭向量(纯图检索/纯规则兜底)
- 统一隔离策略:共用一套库,用
project_id(以及graph_id)隔离,不再“每个项目覆盖前一个”。
新增 EXTRACT_API_KEY / EXTRACT_BASE_URL / EXTRACT_MODEL_NAME:
- 用于“本体生成 / 实体关系抽取”等 JSON 结构化任务
- 当你遇到
400 data_inspection_failed / inappropriate content(某些供应商更严格)时,可只替换抽取模型,不影响主 LLM 配置。
另新增 REPORT_API_KEY / REPORT_BASE_URL / REPORT_MODEL_NAME:
- 用于“报告生成”(ReportAgent)
- 报告生成会携带模拟/检索到的原始文本,部分供应商可能对“输入内容审核”更严格;此时可单独切换报告模型(不影响抽取与主对话)。
同时做了兼容增强:
LLM_BASE_URL自动补全/v1(部分 OpenAI-compatible 提供方要求)- JSON 输出解析更健壮(部分提供方不支持
response_format=json_object时自动降级)
- 抽取触发提供方审核时会进入 safe-mode 重试
- 仍失败则跳过该 chunk 的实体/边抽取(chunk 文本仍会写入存储),避免整个任务失败
针对“同名但 entity_type 不同导致多个节点”的问题:
- 构图入库前对实体类型做归一映射(
Person/Organization/Product/Location) - 同时保留原始抽取类型到节点属性
source_entity_types,便于追溯
GRAPH_BACKEND=local时不支持“模拟过程中实时回写图谱记忆”(原本给 Zep 用):- 后端会自动降级关闭
enable_graph_memory_update,避免 400/500 - 前端会显示 warning,而不是直接失败
- 后端会自动降级关闭
- Step3 启动模拟前自动检测并执行
prepare(避免“未准备直接 start 导致 400”)
ReportAgent 在本地模式下的工具服务由 LocalToolsService 提供,已补齐:
get_simulation_context(与上游接口对齐)interview_agents:直接调用真实的 OASIS 采访批量接口(需要模拟环境仍在运行)
新增前端项目列表页:
- 路由:
/projects - 支持查看历史项目列表并点击进入对应项目流程页
- 支持勾选批量删除项目(删除前确认,优先清理图谱再删除项目)
- 默认入口已指向
http://localhost:3000/projects,首页可通过http://localhost:3000/home访问 npm run dev会先启动本地依赖(自动尝试 unpause 再 docker compose up -d)
- 修复禁用采访时
disable_interview未定义导致的报告生成中断
- 项目列表支持勾选批量删除项目(删除前确认,优先清理图谱再删除项目)
- 修复禁用采访时
disable_interview未定义导致的报告生成中断
项目会以 project_id 持久化在后端 uploads 目录中:
- 项目目录:
MiroFish-Optimize/backend/uploads/projects/<project_id>/ - 元数据:
MiroFish-Optimize/backend/uploads/projects/<project_id>/project.json - 原始文件:
MiroFish-Optimize/backend/uploads/projects/<project_id>/files/ - 抽取文本:
MiroFish-Optimize/backend/uploads/projects/<project_id>/extracted_text.txt
查看历史项目有两种方式:
- 前端:打开
http://localhost:3000/projects - 后端 API:
GET /api/graph/project/list
- 图谱:Neo4j(容器默认暴露
bolt://localhost:7687,浏览器http://localhost:7474) - 向量:Qdrant(默认
http://localhost:6333) - Qdrant collection:由
.env的QDRANT_COLLECTION_CHUNKS控制(默认mirofish_chunks)
- Node.js 18+
- Python 3.11+
uv(Python 依赖管理)- Docker(推荐,用于一键启动 Neo4j/Qdrant)
docker compose -f docker-compose.local.yml up -d默认 Neo4j 账号密码在 docker-compose.local.yml 中写死为:
- 用户:
neo4j - 密码:
mirofish
对应 .env 里需要保持一致:NEO4J_PASSWORD=mirofish
cp .env.example .env至少需要配置:
# OpenAI-compatible LLM
LLM_API_KEY=你的key
LLM_BASE_URL=你的base_url
LLM_MODEL_NAME=你的模型名
# 本地化存储
GRAPH_BACKEND=local
VECTOR_BACKEND=qdrant
# Neo4j(与 compose 一致)
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=mirofish
# Qdrant
QDRANT_URL=http://localhost:6333可选项(强烈建议了解):
# 抽取专用 LLM:解决 data_inspection_failed 等审核问题
# EXTRACT_API_KEY=...
# EXTRACT_BASE_URL=...
# EXTRACT_MODEL_NAME=...
# 报告专用 LLM:报告生成触发 data_inspection_failed 时使用
# REPORT_API_KEY=...
# REPORT_BASE_URL=...
# REPORT_MODEL_NAME=...
# Embeddings:如果你的提供方支持 embeddings,建议配置;不支持则可 VECTOR_BACKEND=none
EMBEDDING_MODEL_NAME=...
# EMBEDDING_BASE_URL=...
# EMBEDDING_API_KEY=...在项目根目录执行:
npm run setup:all如果你不想使用 uv,也可以用原生 venv + pip(仅安装后端 Python 依赖):
cd backend
python -m venv .venv
# Windows PowerShell
.\.venv\Scripts\Activate.ps1
# macOS/Linux
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txtnpm run dev访问:
- 前端:
http://localhost:3000 - 后端:
http://localhost:5001
- Step1 图谱构建:上传材料 → 生成本体 → 构图(本地写入 Neo4j,可选写入 Qdrant)
- Step2 环境准备:基于图谱实体生成 Agent Profiles(写入
backend/uploads/simulations/<simulation_id>/...) - Step3 启动模拟:启动并行模拟(Twitter + Reddit),本地模式会自动关闭“图谱记忆实时回写”;需要中途停止时可点击页面右上角「暂停模拟」
- Step4 生成报告:ReportAgent 调用本地工具(图 + 向量 + 采访)生成报告
- Step5 交互:对报告与模拟世界进行交互式查询;若采访不可用/超时,会自动降级为“人设 + 图谱/向量检索”回答
- 报告生成完成后支持导出为 Markdown:
- 页面 Step4 右侧有「导出报告(MD)」按钮
- 或直接访问:
GET /api/report/<report_id>/download
- 本地文件也会落盘在:
backend/uploads/reports/<report_id>/full_report.md
- 报错
400 data_inspection_failed / inappropriate content:- 如果发生在“构图/抽取”阶段:使用
EXTRACT_*把“抽取模型”单独切换到更合适的提供方/模型。 - 如果发生在“报告生成”阶段:使用
REPORT_*把“报告模型”单独切换到更合适的提供方/模型(后端也会自动尝试安全模式降级,但报告会更抽象)。
- 如果发生在“构图/抽取”阶段:使用
- 启动模拟
HTTP 400: 未准备好,请先 prepare:- Step3 已增加自动 prepare;如果仍发生,请确认你启动的是
MiroFish-Optimize这套后端(端口 5001)。
- Step3 已增加自动 prepare;如果仍发生,请确认你启动的是
- 报错
interview_agents ... env 未运行或已关闭:- 采访工具需要模拟环境仍在运行;不要提前关闭环境(或先重新启动模拟)。
- 交互阶段采访
HTTP 400/504超时:- 这是 IPC 未收到模拟进程响应;当前版本已自动降级为“人设 + 图谱/向量检索”兜底回答。
- 图谱里同名多节点:
- 这是“类型抖动”引起的;本优化版已对 Person/Organization/Product/Location 做归一,需重建图谱后生效。
遵循上游 MiroFish 的开源许可证(仓库根目录 LICENSE)。