🐙 Octop

Octop 是一个开源、自托管的 AI 助手。名字取自 章鱼(Octopus) ------八爪并展、灵活多变、可同时处理多项任务。
💡 概括 :Octop 不只是工具,更是可并行运作的数字生命体。
Octop 的设计目标非常明确:
- ✅ 每一次对话、工作区与凭据都留在你自己的机器上(完全自托管)
- ✅ 为每个用户配备一组可按场景切换的专业 Agent(多用户 + 多 Agent)
🏗️ 整体架构:
Octop 的架构比想象中简洁得多 ------没有外部消息队列,没有微服务,没有中间件。一个进程搞定一切。
核心组件一览
#mermaid-svg-i75W6faGUCzmA1Jp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-i75W6faGUCzmA1Jp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-i75W6faGUCzmA1Jp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-i75W6faGUCzmA1Jp .error-icon{fill:#552222;}#mermaid-svg-i75W6faGUCzmA1Jp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-i75W6faGUCzmA1Jp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-i75W6faGUCzmA1Jp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-i75W6faGUCzmA1Jp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-i75W6faGUCzmA1Jp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-i75W6faGUCzmA1Jp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-i75W6faGUCzmA1Jp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-i75W6faGUCzmA1Jp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-i75W6faGUCzmA1Jp .marker.cross{stroke:#333333;}#mermaid-svg-i75W6faGUCzmA1Jp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-i75W6faGUCzmA1Jp p{margin:0;}#mermaid-svg-i75W6faGUCzmA1Jp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-i75W6faGUCzmA1Jp .cluster-label text{fill:#333;}#mermaid-svg-i75W6faGUCzmA1Jp .cluster-label span{color:#333;}#mermaid-svg-i75W6faGUCzmA1Jp .cluster-label span p{background-color:transparent;}#mermaid-svg-i75W6faGUCzmA1Jp .label text,#mermaid-svg-i75W6faGUCzmA1Jp span{fill:#333;color:#333;}#mermaid-svg-i75W6faGUCzmA1Jp .node rect,#mermaid-svg-i75W6faGUCzmA1Jp .node circle,#mermaid-svg-i75W6faGUCzmA1Jp .node ellipse,#mermaid-svg-i75W6faGUCzmA1Jp .node polygon,#mermaid-svg-i75W6faGUCzmA1Jp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-i75W6faGUCzmA1Jp .rough-node .label text,#mermaid-svg-i75W6faGUCzmA1Jp .node .label text,#mermaid-svg-i75W6faGUCzmA1Jp .image-shape .label,#mermaid-svg-i75W6faGUCzmA1Jp .icon-shape .label{text-anchor:middle;}#mermaid-svg-i75W6faGUCzmA1Jp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-i75W6faGUCzmA1Jp .rough-node .label,#mermaid-svg-i75W6faGUCzmA1Jp .node .label,#mermaid-svg-i75W6faGUCzmA1Jp .image-shape .label,#mermaid-svg-i75W6faGUCzmA1Jp .icon-shape .label{text-align:center;}#mermaid-svg-i75W6faGUCzmA1Jp .node.clickable{cursor:pointer;}#mermaid-svg-i75W6faGUCzmA1Jp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-i75W6faGUCzmA1Jp .arrowheadPath{fill:#333333;}#mermaid-svg-i75W6faGUCzmA1Jp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-i75W6faGUCzmA1Jp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-i75W6faGUCzmA1Jp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-i75W6faGUCzmA1Jp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-i75W6faGUCzmA1Jp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-i75W6faGUCzmA1Jp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-i75W6faGUCzmA1Jp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-i75W6faGUCzmA1Jp .cluster text{fill:#333;}#mermaid-svg-i75W6faGUCzmA1Jp .cluster span{color:#333;}#mermaid-svg-i75W6faGUCzmA1Jp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-i75W6faGUCzmA1Jp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-i75W6faGUCzmA1Jp rect.text{fill:none;stroke-width:0;}#mermaid-svg-i75W6faGUCzmA1Jp .icon-shape,#mermaid-svg-i75W6faGUCzmA1Jp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-i75W6faGUCzmA1Jp .icon-shape p,#mermaid-svg-i75W6faGUCzmA1Jp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-i75W6faGUCzmA1Jp .icon-shape .label rect,#mermaid-svg-i75W6faGUCzmA1Jp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-i75W6faGUCzmA1Jp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-i75W6faGUCzmA1Jp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-i75W6faGUCzmA1Jp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 💾 存储层
SQLite / PostgreSQL
用户 · Agent · 会话
工作区
~/.octop/agents/
🧠 核心运行时(Harness 技术栈)
harness-agent
Agent 运行时
harness-gateway
IM 通道桥接
harness-memory
分层记忆与检索
harness-browser
浏览器自动化
⚙️ HarnessProcessor(进程内统一路由)
消息路由与分发
👤 用户入口
🌐 Web 控制台
💻 CLI
📱 IM 通道
飞书/钉钉/QQ/Discord/企业微信
⏰ 定时任务
四件套详解
| 组件 | 职责 | 关键技术 |
|---|---|---|
| harness-agent | Agent 运行时:模型路由、工具调用、技能管理、对话检查点 | 基于腾讯自研 harness 运行时 |
| harness-gateway | 多平台 IM 通道桥接,归一化消息处理 | 飞书/钉钉/QQ/Discord/企业微信等 |
| harness-memory | 分层记忆与全文检索,记忆随工作区迁移 | 分层召回 + 全文检索 |
| harness-browser | 基于 CDP 的浏览器自动化,持久化配置 | Chromium DevTools Protocol |
技术栈全景
#mermaid-svg-74qq90662tDiERwq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-74qq90662tDiERwq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-74qq90662tDiERwq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-74qq90662tDiERwq .error-icon{fill:#552222;}#mermaid-svg-74qq90662tDiERwq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-74qq90662tDiERwq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-74qq90662tDiERwq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-74qq90662tDiERwq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-74qq90662tDiERwq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-74qq90662tDiERwq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-74qq90662tDiERwq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-74qq90662tDiERwq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-74qq90662tDiERwq .marker.cross{stroke:#333333;}#mermaid-svg-74qq90662tDiERwq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-74qq90662tDiERwq p{margin:0;}#mermaid-svg-74qq90662tDiERwq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-74qq90662tDiERwq .cluster-label text{fill:#333;}#mermaid-svg-74qq90662tDiERwq .cluster-label span{color:#333;}#mermaid-svg-74qq90662tDiERwq .cluster-label span p{background-color:transparent;}#mermaid-svg-74qq90662tDiERwq .label text,#mermaid-svg-74qq90662tDiERwq span{fill:#333;color:#333;}#mermaid-svg-74qq90662tDiERwq .node rect,#mermaid-svg-74qq90662tDiERwq .node circle,#mermaid-svg-74qq90662tDiERwq .node ellipse,#mermaid-svg-74qq90662tDiERwq .node polygon,#mermaid-svg-74qq90662tDiERwq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-74qq90662tDiERwq .rough-node .label text,#mermaid-svg-74qq90662tDiERwq .node .label text,#mermaid-svg-74qq90662tDiERwq .image-shape .label,#mermaid-svg-74qq90662tDiERwq .icon-shape .label{text-anchor:middle;}#mermaid-svg-74qq90662tDiERwq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-74qq90662tDiERwq .rough-node .label,#mermaid-svg-74qq90662tDiERwq .node .label,#mermaid-svg-74qq90662tDiERwq .image-shape .label,#mermaid-svg-74qq90662tDiERwq .icon-shape .label{text-align:center;}#mermaid-svg-74qq90662tDiERwq .node.clickable{cursor:pointer;}#mermaid-svg-74qq90662tDiERwq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-74qq90662tDiERwq .arrowheadPath{fill:#333333;}#mermaid-svg-74qq90662tDiERwq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-74qq90662tDiERwq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-74qq90662tDiERwq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-74qq90662tDiERwq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-74qq90662tDiERwq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-74qq90662tDiERwq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-74qq90662tDiERwq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-74qq90662tDiERwq .cluster text{fill:#333;}#mermaid-svg-74qq90662tDiERwq .cluster span{color:#333;}#mermaid-svg-74qq90662tDiERwq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-74qq90662tDiERwq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-74qq90662tDiERwq rect.text{fill:none;stroke-width:0;}#mermaid-svg-74qq90662tDiERwq .icon-shape,#mermaid-svg-74qq90662tDiERwq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-74qq90662tDiERwq .icon-shape p,#mermaid-svg-74qq90662tDiERwq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-74qq90662tDiERwq .icon-shape .label rect,#mermaid-svg-74qq90662tDiERwq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-74qq90662tDiERwq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-74qq90662tDiERwq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-74qq90662tDiERwq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🗄️ 数据
SQLite (WAL)
PostgreSQL
⚡ 后端
Python 3.12+
FastAPI + uvicorn
APScheduler
🎨 前端
React 18
TypeScript
Vite
Ant Design
📌 关键设计理念 :所有入口------Web UI、IM 通道、定时任务------共用同一套消息处理链路,通过进程内的 HarnessProcessor 统一路由。
单进程架构的权衡
| 优点 ✅ | 风险 ⚠️ |
|---|---|
部署极简:一条 octop run 启动 |
一个组件崩溃,全部停摆 |
| 无需配置消息队列、中间件 | SQLite 高并发下有写锁瓶颈 |
| 适合家庭和小团队场景 | --- |
🚀 核心能力详解
1️⃣ 多用户 + 多 Agent 专家团
核心理念:不是"一个 Agent 什么都做",而是"多个 Agent 各做各的"。
#mermaid-svg-TvvgTtW34C8d6vpA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TvvgTtW34C8d6vpA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TvvgTtW34C8d6vpA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TvvgTtW34C8d6vpA .error-icon{fill:#552222;}#mermaid-svg-TvvgTtW34C8d6vpA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TvvgTtW34C8d6vpA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TvvgTtW34C8d6vpA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TvvgTtW34C8d6vpA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TvvgTtW34C8d6vpA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TvvgTtW34C8d6vpA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TvvgTtW34C8d6vpA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TvvgTtW34C8d6vpA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TvvgTtW34C8d6vpA .marker.cross{stroke:#333333;}#mermaid-svg-TvvgTtW34C8d6vpA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TvvgTtW34C8d6vpA p{margin:0;}#mermaid-svg-TvvgTtW34C8d6vpA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TvvgTtW34C8d6vpA .cluster-label text{fill:#333;}#mermaid-svg-TvvgTtW34C8d6vpA .cluster-label span{color:#333;}#mermaid-svg-TvvgTtW34C8d6vpA .cluster-label span p{background-color:transparent;}#mermaid-svg-TvvgTtW34C8d6vpA .label text,#mermaid-svg-TvvgTtW34C8d6vpA span{fill:#333;color:#333;}#mermaid-svg-TvvgTtW34C8d6vpA .node rect,#mermaid-svg-TvvgTtW34C8d6vpA .node circle,#mermaid-svg-TvvgTtW34C8d6vpA .node ellipse,#mermaid-svg-TvvgTtW34C8d6vpA .node polygon,#mermaid-svg-TvvgTtW34C8d6vpA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TvvgTtW34C8d6vpA .rough-node .label text,#mermaid-svg-TvvgTtW34C8d6vpA .node .label text,#mermaid-svg-TvvgTtW34C8d6vpA .image-shape .label,#mermaid-svg-TvvgTtW34C8d6vpA .icon-shape .label{text-anchor:middle;}#mermaid-svg-TvvgTtW34C8d6vpA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TvvgTtW34C8d6vpA .rough-node .label,#mermaid-svg-TvvgTtW34C8d6vpA .node .label,#mermaid-svg-TvvgTtW34C8d6vpA .image-shape .label,#mermaid-svg-TvvgTtW34C8d6vpA .icon-shape .label{text-align:center;}#mermaid-svg-TvvgTtW34C8d6vpA .node.clickable{cursor:pointer;}#mermaid-svg-TvvgTtW34C8d6vpA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TvvgTtW34C8d6vpA .arrowheadPath{fill:#333333;}#mermaid-svg-TvvgTtW34C8d6vpA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TvvgTtW34C8d6vpA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TvvgTtW34C8d6vpA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TvvgTtW34C8d6vpA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TvvgTtW34C8d6vpA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TvvgTtW34C8d6vpA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TvvgTtW34C8d6vpA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TvvgTtW34C8d6vpA .cluster text{fill:#333;}#mermaid-svg-TvvgTtW34C8d6vpA .cluster span{color:#333;}#mermaid-svg-TvvgTtW34C8d6vpA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TvvgTtW34C8d6vpA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TvvgTtW34C8d6vpA rect.text{fill:none;stroke-width:0;}#mermaid-svg-TvvgTtW34C8d6vpA .icon-shape,#mermaid-svg-TvvgTtW34C8d6vpA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TvvgTtW34C8d6vpA .icon-shape p,#mermaid-svg-TvvgTtW34C8d6vpA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TvvgTtW34C8d6vpA .icon-shape .label rect,#mermaid-svg-TvvgTtW34C8d6vpA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TvvgTtW34C8d6vpA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TvvgTtW34C8d6vpA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TvvgTtW34C8d6vpA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 👨👩👧👦 家庭/团队
🤖 Agent 专家团
📝 文案专家
💻 代码专家
⚖️ 法律顾问
🥗 营养师
📊 数据分析师
👑 管理员
👤 成员 A
👤 成员 B
👤 成员 C
- 一人管理,全家共用:一个管理员账号即可为全家创建成员,每位成员拥有独立的 Agent 与工作区,彼此数据隔离
- 内置专家库:预置"法律顾问""营养师""代码审校""运维文案"等角色,按场景一键切换
- 使用方式 :
@营养师 帮我看下这周的三餐搭配合不合理
2️⃣ MBTI 人格
16 种人格模板 + 互动测试。
🎯 实际价值 :不同场景需要不同沟通风格------技术排障需要 ISTJ 式的严谨,创意头脑风暴需要 ENFP 式的发散。人格模板本质上是预设的系统提示词,大幅降低调教成本。
3️⃣ Connector 拓展体系
Connector 是 Octop 连接外部世界的"触手"。
#mermaid-svg-PppXB199peZtuhm3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PppXB199peZtuhm3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PppXB199peZtuhm3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PppXB199peZtuhm3 .error-icon{fill:#552222;}#mermaid-svg-PppXB199peZtuhm3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PppXB199peZtuhm3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PppXB199peZtuhm3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PppXB199peZtuhm3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PppXB199peZtuhm3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PppXB199peZtuhm3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PppXB199peZtuhm3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PppXB199peZtuhm3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PppXB199peZtuhm3 .marker.cross{stroke:#333333;}#mermaid-svg-PppXB199peZtuhm3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PppXB199peZtuhm3 p{margin:0;}#mermaid-svg-PppXB199peZtuhm3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PppXB199peZtuhm3 .cluster-label text{fill:#333;}#mermaid-svg-PppXB199peZtuhm3 .cluster-label span{color:#333;}#mermaid-svg-PppXB199peZtuhm3 .cluster-label span p{background-color:transparent;}#mermaid-svg-PppXB199peZtuhm3 .label text,#mermaid-svg-PppXB199peZtuhm3 span{fill:#333;color:#333;}#mermaid-svg-PppXB199peZtuhm3 .node rect,#mermaid-svg-PppXB199peZtuhm3 .node circle,#mermaid-svg-PppXB199peZtuhm3 .node ellipse,#mermaid-svg-PppXB199peZtuhm3 .node polygon,#mermaid-svg-PppXB199peZtuhm3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PppXB199peZtuhm3 .rough-node .label text,#mermaid-svg-PppXB199peZtuhm3 .node .label text,#mermaid-svg-PppXB199peZtuhm3 .image-shape .label,#mermaid-svg-PppXB199peZtuhm3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-PppXB199peZtuhm3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PppXB199peZtuhm3 .rough-node .label,#mermaid-svg-PppXB199peZtuhm3 .node .label,#mermaid-svg-PppXB199peZtuhm3 .image-shape .label,#mermaid-svg-PppXB199peZtuhm3 .icon-shape .label{text-align:center;}#mermaid-svg-PppXB199peZtuhm3 .node.clickable{cursor:pointer;}#mermaid-svg-PppXB199peZtuhm3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PppXB199peZtuhm3 .arrowheadPath{fill:#333333;}#mermaid-svg-PppXB199peZtuhm3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PppXB199peZtuhm3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PppXB199peZtuhm3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PppXB199peZtuhm3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PppXB199peZtuhm3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PppXB199peZtuhm3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PppXB199peZtuhm3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PppXB199peZtuhm3 .cluster text{fill:#333;}#mermaid-svg-PppXB199peZtuhm3 .cluster span{color:#333;}#mermaid-svg-PppXB199peZtuhm3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PppXB199peZtuhm3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PppXB199peZtuhm3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-PppXB199peZtuhm3 .icon-shape,#mermaid-svg-PppXB199peZtuhm3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PppXB199peZtuhm3 .icon-shape p,#mermaid-svg-PppXB199peZtuhm3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PppXB199peZtuhm3 .icon-shape .label rect,#mermaid-svg-PppXB199peZtuhm3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PppXB199peZtuhm3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PppXB199peZtuhm3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PppXB199peZtuhm3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🌍 外部资源
🔌 Connector 层
🐙 Octop
Agent
OAuth 网关
MCP 网关
腾讯文档
微博热点
新闻资讯
任意第三方工具
- 一键接入腾讯全家桶:腾讯文档、微博热点、新闻资讯等
- OAuth + MCP 网关:把资料查询能力直接变成 Agent 的"手和脚"
- 开发者视角 :Connector 是一层标准化的"能力即插件 "抽象------新增数据源只需注册 OAuth 应用或挂载 MCP Server,无需改动核心代码
4️⃣ 可插拔后端存储
安全是 Octop 的底层信条 。Agent 的所有读写都发生在工作区(Workspace) 内,而后端是可插拔的:
| 后端类型 | 适用场景 |
|---|---|
| 本地文件系统 | 开发/单机部署 |
| Docker 容器 | 隔离运行 |
| PostgreSQL | 结构化存储,支持 Schema 隔离 |
| 腾讯云 COS / Amazon S3 | 云端存储,大文件支持 |
5️⃣ 可迁移记忆系统
基于 harness-memory 构建。
#mermaid-svg-kNMIMivlVDSFkCe4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kNMIMivlVDSFkCe4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kNMIMivlVDSFkCe4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kNMIMivlVDSFkCe4 .error-icon{fill:#552222;}#mermaid-svg-kNMIMivlVDSFkCe4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kNMIMivlVDSFkCe4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kNMIMivlVDSFkCe4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kNMIMivlVDSFkCe4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kNMIMivlVDSFkCe4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kNMIMivlVDSFkCe4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kNMIMivlVDSFkCe4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kNMIMivlVDSFkCe4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kNMIMivlVDSFkCe4 .marker.cross{stroke:#333333;}#mermaid-svg-kNMIMivlVDSFkCe4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kNMIMivlVDSFkCe4 p{margin:0;}#mermaid-svg-kNMIMivlVDSFkCe4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kNMIMivlVDSFkCe4 .cluster-label text{fill:#333;}#mermaid-svg-kNMIMivlVDSFkCe4 .cluster-label span{color:#333;}#mermaid-svg-kNMIMivlVDSFkCe4 .cluster-label span p{background-color:transparent;}#mermaid-svg-kNMIMivlVDSFkCe4 .label text,#mermaid-svg-kNMIMivlVDSFkCe4 span{fill:#333;color:#333;}#mermaid-svg-kNMIMivlVDSFkCe4 .node rect,#mermaid-svg-kNMIMivlVDSFkCe4 .node circle,#mermaid-svg-kNMIMivlVDSFkCe4 .node ellipse,#mermaid-svg-kNMIMivlVDSFkCe4 .node polygon,#mermaid-svg-kNMIMivlVDSFkCe4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kNMIMivlVDSFkCe4 .rough-node .label text,#mermaid-svg-kNMIMivlVDSFkCe4 .node .label text,#mermaid-svg-kNMIMivlVDSFkCe4 .image-shape .label,#mermaid-svg-kNMIMivlVDSFkCe4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-kNMIMivlVDSFkCe4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kNMIMivlVDSFkCe4 .rough-node .label,#mermaid-svg-kNMIMivlVDSFkCe4 .node .label,#mermaid-svg-kNMIMivlVDSFkCe4 .image-shape .label,#mermaid-svg-kNMIMivlVDSFkCe4 .icon-shape .label{text-align:center;}#mermaid-svg-kNMIMivlVDSFkCe4 .node.clickable{cursor:pointer;}#mermaid-svg-kNMIMivlVDSFkCe4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kNMIMivlVDSFkCe4 .arrowheadPath{fill:#333333;}#mermaid-svg-kNMIMivlVDSFkCe4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kNMIMivlVDSFkCe4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kNMIMivlVDSFkCe4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kNMIMivlVDSFkCe4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kNMIMivlVDSFkCe4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kNMIMivlVDSFkCe4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kNMIMivlVDSFkCe4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kNMIMivlVDSFkCe4 .cluster text{fill:#333;}#mermaid-svg-kNMIMivlVDSFkCe4 .cluster span{color:#333;}#mermaid-svg-kNMIMivlVDSFkCe4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kNMIMivlVDSFkCe4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kNMIMivlVDSFkCe4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-kNMIMivlVDSFkCe4 .icon-shape,#mermaid-svg-kNMIMivlVDSFkCe4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kNMIMivlVDSFkCe4 .icon-shape p,#mermaid-svg-kNMIMivlVDSFkCe4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kNMIMivlVDSFkCe4 .icon-shape .label rect,#mermaid-svg-kNMIMivlVDSFkCe4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kNMIMivlVDSFkCe4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kNMIMivlVDSFkCe4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kNMIMivlVDSFkCe4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🧠 记忆系统
证据采集
信号标记
梦 consolidation
候选记忆
人工审核
活跃记忆
📖 工作流程:Evidence → Signal Tags → Dream Consolidation → Candidate → Human Review → Active Memory
- 分层召回 + 全文检索:让记忆既"深"又"快"
- 记忆随工作区迁移:换模型、换机器都不失忆
- 跨会话持久化:Agent 能记住用户偏好、项目上下文和历史决策
6️⃣ Loop Engineering Agent 引擎
🎯 核心思想 :不是让用户"提示" Agent,而是设计一套让 Agent 自主迭代的循环系统。
#mermaid-svg-MplvbtdYs0FAO1PB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MplvbtdYs0FAO1PB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MplvbtdYs0FAO1PB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MplvbtdYs0FAO1PB .error-icon{fill:#552222;}#mermaid-svg-MplvbtdYs0FAO1PB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MplvbtdYs0FAO1PB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MplvbtdYs0FAO1PB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MplvbtdYs0FAO1PB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MplvbtdYs0FAO1PB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MplvbtdYs0FAO1PB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MplvbtdYs0FAO1PB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MplvbtdYs0FAO1PB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MplvbtdYs0FAO1PB .marker.cross{stroke:#333333;}#mermaid-svg-MplvbtdYs0FAO1PB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MplvbtdYs0FAO1PB p{margin:0;}#mermaid-svg-MplvbtdYs0FAO1PB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-MplvbtdYs0FAO1PB .cluster-label text{fill:#333;}#mermaid-svg-MplvbtdYs0FAO1PB .cluster-label span{color:#333;}#mermaid-svg-MplvbtdYs0FAO1PB .cluster-label span p{background-color:transparent;}#mermaid-svg-MplvbtdYs0FAO1PB .label text,#mermaid-svg-MplvbtdYs0FAO1PB span{fill:#333;color:#333;}#mermaid-svg-MplvbtdYs0FAO1PB .node rect,#mermaid-svg-MplvbtdYs0FAO1PB .node circle,#mermaid-svg-MplvbtdYs0FAO1PB .node ellipse,#mermaid-svg-MplvbtdYs0FAO1PB .node polygon,#mermaid-svg-MplvbtdYs0FAO1PB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MplvbtdYs0FAO1PB .rough-node .label text,#mermaid-svg-MplvbtdYs0FAO1PB .node .label text,#mermaid-svg-MplvbtdYs0FAO1PB .image-shape .label,#mermaid-svg-MplvbtdYs0FAO1PB .icon-shape .label{text-anchor:middle;}#mermaid-svg-MplvbtdYs0FAO1PB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MplvbtdYs0FAO1PB .rough-node .label,#mermaid-svg-MplvbtdYs0FAO1PB .node .label,#mermaid-svg-MplvbtdYs0FAO1PB .image-shape .label,#mermaid-svg-MplvbtdYs0FAO1PB .icon-shape .label{text-align:center;}#mermaid-svg-MplvbtdYs0FAO1PB .node.clickable{cursor:pointer;}#mermaid-svg-MplvbtdYs0FAO1PB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MplvbtdYs0FAO1PB .arrowheadPath{fill:#333333;}#mermaid-svg-MplvbtdYs0FAO1PB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MplvbtdYs0FAO1PB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MplvbtdYs0FAO1PB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MplvbtdYs0FAO1PB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MplvbtdYs0FAO1PB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MplvbtdYs0FAO1PB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MplvbtdYs0FAO1PB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MplvbtdYs0FAO1PB .cluster text{fill:#333;}#mermaid-svg-MplvbtdYs0FAO1PB .cluster span{color:#333;}#mermaid-svg-MplvbtdYs0FAO1PB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MplvbtdYs0FAO1PB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MplvbtdYs0FAO1PB rect.text{fill:none;stroke-width:0;}#mermaid-svg-MplvbtdYs0FAO1PB .icon-shape,#mermaid-svg-MplvbtdYs0FAO1PB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MplvbtdYs0FAO1PB .icon-shape p,#mermaid-svg-MplvbtdYs0FAO1PB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MplvbtdYs0FAO1PB .icon-shape .label rect,#mermaid-svg-MplvbtdYs0FAO1PB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MplvbtdYs0FAO1PB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MplvbtdYs0FAO1PB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MplvbtdYs0FAO1PB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🔄 Loop Engineering 循环
未通过
通过
📋 复杂任务输入
✂️ 任务拆解
⚡ 执行
🤔 反思
🔄 重试
✅ 验证
📤 任务完成
- 任务拆解:将复杂任务分解为可执行的子任务
- 反思与重试:Agent 能自我评估执行结果,失败时自动调整策略
- 驯服复杂任务:让 Agent 真正"把活干完",而不是卡在第一环
7️⃣ 远程桌面(重磅亮点 🌟)
- 实时看屏 + 键鼠操控:跨 Linux / Windows / macOS
- 无图形 Linux 也能一键搭建隔离桌面
- 适合远程办公、GUI 软件操作
8️⃣ 更多能力一览
| 能力 | 说明 |
|---|---|
| 终端 AI+ | 浏览器内交互式 Shell,AI 辅助命令执行与排障 |
| 浏览器 AI+ | 基于 Chromium 的无头浏览器,支持网页自动化、截图 |
| ACP 双向集成 | octop acp 增强 IDE 与终端 AI;可委派 OpenCode / Claude Code |
| 安全内置 | JWT 多用户隔离、工具审批、Shell 命令防护、敏感信息脱敏 |
🏃 快速上手
安装
bash
# 一键安装(推荐)
curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install.sh | bash
# 或通过 PyPI
pip install octop
初始化
bash
octop init
交互式向导会创建 SQLite 数据库、JWT 密钥和第一个管理员账号。
启动
bash
octop run
访问 http://127.0.0.1:8088 ,默认账号 admin / 密码 octop(请立即修改)。
数据目录结构
~/.octop/
├── config.json # 进程配置(host、port、CORS、DB 等)
├── octop.db # SQLite 控制面(用户、Agent、会话、审计)
├── secrets/
│ └── jwt_secret # 32 字节随机密钥
├── agents/<agent_id>/ # 各 Agent 工作区
├── plugins/ # 第三方插件
├── logs/ # 运行日志
└── ssl/ # 自签名证书
📊 总结
| 🧩 分类 | 📋 内容 |
|---|---|
| 🏛️ 架构理念 | 单进程设计 自托管 数据本地化 |
| ⚡ 核心能力 | 多用户多 Agent MBTI 人格 Connector 生态 可插拔存储 可迁移记忆 Loop Engineering 引擎 远程桌面 |
| 💻 技术栈 | Python + FastAPI React + TypeScript SQLite / PostgreSQL Harness 技术栈(agent / gateway / memory / browser) |
| 🎯 适用场景 | 个人助理 家庭共享 团队协作 开发者增效 网页自动化 定时任务 |
Octop 以极简的单进程架构 实现了多用户、多 Agent 的复杂能力,同时坚守完全自托管的隐私底线。
🔗 官方链接 :GitHub - TencentCloud/Octop