面向地缘风险与舆情推演的统一工作台,主链路为
全球观测 -> 议题研判 -> 未来预测 -> 自动流程
OrcaFish 不是单点页面集合,而是一条可连续演示、可连续操作的风险工作流:
全球观测:持续接收热点国家、新闻摘要、Agent 观察焦点与风险排行议题研判:多代理并行生成搜索流、媒体流、洞察流与综合结论未来预测:把议题或国家观察包送入预测工作台,生成关系图谱、行动流与预测报告自动流程:把观测、研判、预测串成一条统一编排链路
当前版本已经吸收并融合了你提供的几个项目方向,尤其参考了:
F:\1work\OrcFish\MiroFishF:\3work\1风险预测\MiroFishF:\1work\OrcFish\BettaFishF:\1work\OrcFish\worldmonitor- 本地
zep-local / graphiti
- 使用平面世界地图,不再依赖 3D 旋转地球
- 可持续轮询实时新闻、信号、Agent 焦点
- 内置多国家 fallback 数据,即使外部抓取受限也能保持页面连续刷新
- 国家工作台支持一键送去议题研判或未来预测
- 多代理并行:搜索、媒体、洞察、报告编排
- 支持分段输出,不再等整份报告一次性返回
- 结果流支持 Markdown 渲染
- 已补充阶段事件、监控底稿接入、降级态提示和质量状态
- 已接入公开来源摘录、监控新闻摘要、阶段时间线和来源数统计
- 降级收口时仍会保留真实来源摘录与监控摘要,便于继续观察或送入未来预测
graph / split / workbench三种工作台模式- 先创建预测记录,再按需启动、暂停和继续推演
- 关系图谱支持关系线、关系说明、节点检查器、关系检查器
- 支持关系过滤与“仅当前路径”
- 图谱优先读取本地
zep-local / graphiti内容,远端不可用时回退本地快照与动作层补图 - 报告抽屉与运行详情可联动查看图谱、行动流、时间线和代理体统计
- 预测记录会在本地持久化,服务重启后仍可恢复历史 run 与图谱元数据
- 观测 -> 研判 -> 预测 的链路已打通
- 首页、全球观测、议题研判都可以把上下文包直接送入未来预测
Frontend (React + Vite)
├─ Dashboard
├─ Intelligence
├─ Analysis
├─ Simulation
└─ Pipeline
Backend (FastAPI)
├─ /api/intelligence
├─ /api/analysis
├─ /api/simulation
├─ /api/pipeline
├─ LLM Client (MiniMax / ModelScope / OpenAI-compatible)
├─ Signal Aggregator / CII Engine
├─ GraphBuilder / SnapshotStore / OASISRunner
└─ Report Agents
Optional local services
├─ Zep CE http://localhost:8000
├─ Graphiti http://localhost:8003
└─ Crawl4AI http://localhost:11235
orcafish/
├─ backend/
│ ├─ main.py
│ ├─ config.py
│ ├─ api/routes/
│ │ ├─ intelligence.py
│ │ ├─ analysis.py
│ │ ├─ simulation.py
│ │ └─ pipeline.py
│ ├─ graph/
│ │ ├─ graph_builder.py
│ │ └─ snapshot_store.py
│ ├─ intelligence/
│ ├─ analysis/
│ ├─ simulation/
│ ├─ llm/
│ └─ models/
├─ frontend/
│ ├─ package.json
│ ├─ vite.config.ts
│ └─ src/
│ ├─ App.tsx
│ ├─ stores/
│ └─ components/
├─ tests/
│ └─ test_backend_smoke.py
├─ docs/
│ └─ DEPLOYMENT.md
├─ zep-local/
│ ├─ docker-compose.yml
│ ├─ docker-compose.ce.yaml
│ ├─ .env.example
│ ├─ zep.yaml
│ └─ README.md
├─ .env.example
└─ README.md
- Windows 10/11、Linux 或 macOS
- Python
3.13 - Node.js
18+ pnpm
- 项目内虚拟环境
.venv - Docker Desktop 或你自己的本地
zep-local - 一组可用的 LLM Key
MiniMaxModelScopeZep CE + Graphiticrawl4aiUpstash Redis
cd F:\1work\OrcFish
git clone <your-repo-url> orcafish
cd orcafishpy -3.13 -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -r requirements.txtcd frontend
pnpm install
cd ..Copy-Item .env.example .env仓库里的 .env.example 默认使用 ModelScope。
如果你今晚要演示更强推理链路,常见做法是把 Query / Media / Insight / Report 四路切到 MiniMax,并保留 ModelScope 作为回退。
下面是一套常用演示配置骨架,注意不要把真实密钥提交进仓库。
APP_HOST=0.0.0.0
APP_PORT=8080
MINIMAX_API_KEY=your-minimax-api-key
MODELSCOPE_API_KEY=your-modelscope-api-key
QUERY_LLM_PROVIDER=minimax
QUERY_LLM_API_KEY=${MINIMAX_API_KEY}
QUERY_LLM_BASE_URL=https://api.minimaxi.com/v1
QUERY_LLM_MODEL=MiniMax-M2.7
QUERY_LLM_REASONING_SPLIT=true
MEDIA_LLM_PROVIDER=minimax
MEDIA_LLM_API_KEY=${MINIMAX_API_KEY}
MEDIA_LLM_BASE_URL=https://api.minimaxi.com/v1
MEDIA_LLM_MODEL=MiniMax-M2.7
MEDIA_LLM_REASONING_SPLIT=true
INSIGHT_LLM_PROVIDER=minimax
INSIGHT_LLM_API_KEY=${MINIMAX_API_KEY}
INSIGHT_LLM_BASE_URL=https://api.minimaxi.com/v1
INSIGHT_LLM_MODEL=MiniMax-M2.7
INSIGHT_LLM_REASONING_SPLIT=true
REPORT_LLM_PROVIDER=minimax
REPORT_LLM_API_KEY=${MINIMAX_API_KEY}
REPORT_LLM_BASE_URL=https://api.minimaxi.com/v1
REPORT_LLM_MODEL=MiniMax-M2.7
REPORT_LLM_REASONING_SPLIT=true
FALLBACK_LLM_PROVIDER=modelscope
FALLBACK_LLM_API_KEY=${MODELSCOPE_API_KEY}
FALLBACK_LLM_BASE_URL=https://api-inference.modelscope.cn/v1
FALLBACK_LLM_MODEL=Qwen/Qwen3.5-32B-Instruct说明:
- 当前代码支持扁平变量名,不需要写成嵌套配置
*_REASONING_SPLIT=true会透传extra_body={"reasoning_split": true}- 如果某个代理不想用 MiniMax,可以单独切回 ModelScope
ZEP_BASE_URL=http://localhost:8000
GRAPHITI_BASE_URL=http://localhost:8003
ZEP_API_SECRET=CRAWL4AI_BASE_URL=http://localhost:11235
CRAWL4AI_TOKEN=仓库现在自带一个可直接启动的本地目录:
zep-local/
这也是当前后端默认会尝试拉起的本地 compose 路径:当 ZEP_BASE_URL 保持默认 http://localhost:8000 且 Docker 可用时,backend/main.py 会优先使用 zep-local/docker-compose.yml。
第一次部署建议直接按下面 3 步走,这样新人拿到仓库也能完整复刻:
- 复制模板:
Copy-Item zep-local/.env.example zep-local/.env - 把
zep-local/.env里的OPENAI_API_KEY改成你自己的兼容模型 Key - 把
zep-local/zep.yaml里的api_secret改成你自己的本地 secret,并把项目根目录.env里的ZEP_API_SECRET改成同一个值
然后进入目录启动:
cd zep-local
docker compose up -d默认端口:
8000Zep CE8003Graphiti5432Postgres7474Neo4j HTTP7687Neo4j Bolt
说明:
zep-local/.env是本地私密文件,不要提交进仓库zep-local/zep.yaml当前是示例配置,第一次部署时请把api_secret换成你自己的本地 secret- 如果你保留
ZEP_BASE_URL=http://localhost:8000,后端启动时会优先复用这套zep-local服务;若服务未启动且 Docker 可用,会尝试自动执行同一份 compose
如果你已经有另一套长期运行的本地 zep-local,也可以不使用仓库里的这一份。
你只需要确认:
ZEP_BASE_URL=http://localhost:8000GRAPHITI_BASE_URL=http://localhost:8003ZEP_API_SECRET与本地配置一致
backend/main.py 默认会优先尝试这一路径:
zep-local/docker-compose.ce.yaml- 若不存在,再回退
zep/legacy/docker-compose.ce.yaml
第一次按下面做即可复刻:
- 复制本地服务环境文件:
Copy-Item zep-local\.env.example zep-local\.env - 打开
zep-local/zep.yaml,确认或改掉api_secret - 把项目根目录
.env中的ZEP_API_SECRET改成同一个值 - 在项目根目录执行:
docker compose -f zep-local/docker-compose.ce.yaml up -d
这套默认会拉起:
zepgraphitipostgresneo4j
如果你的仓库里暂时没有 zep-local/,再使用旧的 zep/legacy/ 路径。
Test-NetConnection localhost -Port 8000
Test-NetConnection localhost -Port 8003
Invoke-WebRequest http://localhost:8003/healthcheck推荐稳定方式:
cd F:\1work\OrcFish\orcafish
.venv\Scripts\python.exe -m backend.main如需热重载:
.venv\Scripts\python.exe -m uvicorn backend.main:app --reload --host 0.0.0.0 --port 8080启动后检查:
Invoke-WebRequest http://localhost:8080/healthcd F:\1work\OrcFish\orcafish\frontend
pnpm dev默认访问地址通常为:
如果 Vite 输出了别的地址,以终端输出为准。
- 先启动
zep-local / graphiti - 再启动后端
- 最后启动前端
Invoke-WebRequest http://localhost:8080/health期望:
status=healthy- 如果本地图谱服务已接入,相关健康信息应显示运行中
cd F:\1work\OrcFish\orcafish
.venv\Scripts\python.exe -m pytest tests\test_backend_smoke.py成功标志:
12 passed或更高
cd F:\1work\OrcFish\orcafish\frontend
pnpm build说明:
- 当前大图相关 chunk 仍偏大
- 这不影响今晚演示与部署
- 打开首页
预测总览 - 进入
全球观测 - 选择一个国家或热点事件
- 点
送去议题研判 - 在
议题研判看四段结果逐步到达 - 点
送入未来预测 - 在
未来预测先创建记录,再启动预测 - 展示图谱、行动流、预测详情与报告
台海局势升级后的舆论演化中东局势升级下的全球能源与舆情链式影响南海争端升温后的区域安全与传播路径
这是今晚最稳的方案。
同一台机器上运行:
zep-local / graphitibackend.mainfrontend开发服务或构建产物预览
建议端口:
- 前端:
3000 - 后端:
8080 - Zep:
8000 - Graphiti:
8003
如果你要拆开部署:
- 前端打包后放静态站点或 Nginx
- 后端独立运行 FastAPI
- 前端通过反向代理或环境变量把
/api指到后端 zep-local / graphiti仍建议与后端处于同一内网
建议开三个窗口:
zep-localbackend.mainfrontend pnpm dev
如果你要更稳一点,可以考虑用:
- NSSM
- PM2
- Task Scheduler
把后端和前端挂成长期进程。
GET /api/intelligence/ciiGET /api/intelligence/signalsGET /api/intelligence/newsGET /api/intelligence/focal-pointsGET /api/intelligence/country-context/{iso}
POST /api/analysis/triggerGET /api/analysis/{task_id}
GET /api/simulation/runsPOST /api/simulation/runsPOST /api/simulation/runs/{run_id}/startPOST /api/simulation/runs/{run_id}/stopGET /api/simulation/runs/{run_id}/statusGET /api/simulation/runs/{run_id}/detailGET /api/simulation/runs/{run_id}/profilesGET /api/simulation/runs/{run_id}/actionsGET /api/simulation/runs/{run_id}/timelineGET /api/simulation/runs/{run_id}/agent-statsGET /api/simulation/runs/{run_id}/graphGET /api/simulation/report/{run_id}
这通常不是项目代码错误,而是当前环境对 esbuild 子进程有限制。
可尝试:
- 提权启动终端
- 使用本机正常 PowerShell 或 CMD
- 先执行
pnpm build,确认代码本身无误
如果你看到类似:
WinError 10013Connection error
说明当前环境限制了对外访问。
这时系统仍会:
- 使用 fallback 新闻
- 使用 fallback 信号
- 使用本地监控底稿
所以主链仍可演示,但“完全真实外部数据”会受限。
先检查:
MINIMAX_API_KEY是否有效*_LLM_BASE_URL是否为https://api.minimaxi.com/v1- 本机是否能正常出网
优先检查:
zep-local / graphiti是否真的有数据GRAPHITI_BASE_URL是否可达- 当前预测记录是否已启动并生成
actions.jsonl
说明:
- 当前图谱策略是“远端图优先 + 本地快照兜底 + 动作层补图”
- 远端不可用时仍能出图,但语义厚度会比完整图服务弱
这通常不是页面本身的问题,而是素材不足或外部调用受限。
建议检查:
- 当前 query 是否过大或过泛
- 外部 LLM 是否可连通
- 当前是否落入
degraded降级底稿模式
# 后端烟雾
cd F:\1work\OrcFish\orcafish
.venv\Scripts\python.exe -m pytest tests\test_backend_smoke.py
# 前端构建
cd frontend
pnpm build
# 前端开发
pnpm dev- 跑后端烟雾测试
- 跑前端构建
- 人工走查三页:
全球观测议题研判未来预测
- 重点确认“送去研判”“送入未来预测”链路没断
- 详细部署补充仍保留在 docs/DEPLOYMENT.md
- 本地 Zep CE / Graphiti 的一步一步启动说明见 zep-local/README.md
- 但本 README 现在已经包含完整安装、启动、部署、联调、排障主信息
- 如果你今晚直接交付,优先按本 README 的“单机演示部署”执行即可
本项目在设计、交互、知识图谱工作台和能力接入上,直接或间接参考了以下真实项目:
- 直接主参考:666ghj/MiroFish
- 直接界面 / 能力参考:666ghj/BettaFish
- 全球观测链路参考:koala73/worldmonitor
- 间接参考:mvanhorn/last30days-skill
- 本地 Zep 改造版所基于的上游仓库:666ghj/MiroFish
- 直接融合能力:unclecode/crawl4ai
- 直接融合能力:getzep/zep