在自己电脑上跑个AI工作台,跟ChatGPT一样用,数据全归你
Odysseus vers. 1.0
一个自托管的AI工作空间——旨在成为ChatGPT和Claude用户体验的自托管版本。但更粗糙、更有趣。运行在你自己的硬件上,使用你自己的数据——本地优先、隐私优先,且没有木马。
功能
聊天——与任何本地模型或API聊天;添加它们非常简单。vLLM · llama.cpp · Ollama · OpenRouter · OpenAI
智能体——交给它工具,让它自己完成整个任务。基于opencode · MCP · web · files · shell · skills · memory
食谱——扫描你的硬件,推荐模型,点击即可下载和提供服务……简单!基于llmfit · VRAM感知 · GGUF / FP8 / AWQ · 适配评分 · vLLM / llama.cpp 服务
深度研究——多步骤运行,收集、阅读并综合来源,生成一份漂亮的视觉报告。改编自Tongyi DeepResearch
对比——一个有趣的工具,可以并排比较模型。完全盲测,没有偏见!多模型 · 盲测 · 综合
文档——你写文本,AI负责辅助,而不是相反。多标签编辑器 · markdown · HTML · CSV · 语法高亮 · AI编辑 · 建议
记忆/技能——持久记忆和技能,你的智能体随着时间推移不断进化,因为它更好地理解你和你的任务!ChromaDB · fastembed (ONNX) · 向量 + 关键词检索 · 导入/导出
邮件——内置AI分类的IMAP/SMTP收件箱:紧急提醒、自动标签、自动摘要、自动回复草稿、自动垃圾邮件。IMAP · SMTP · 每个账户路由 · CalDAV感知
笔记与任务——带提醒的快速笔记、待办事项列表以及智能体可以执行的定时任务。笔记提醒 · 清单 · cron风格任务 · ntfy / 浏览器 / 邮件渠道
日历——本地优先的日历,支持与Radicale / Nextcloud / Apple / Fastmail的CalDAV同步。CalDAV拉取 · .ics导入/导出 · 每个日历颜色 · 智能体感知
在手机上运行——在你的手机上看起来和运行起来都很棒,不仅仅是桌面端。响应式 · 可安装(PWA) · 触摸手势
额外功能——更多功能等你探索,如果你尝试一下,我会很高兴!图像编辑器 · 主题编辑器 · 文件上传(视觉 + PDF) · 网页搜索 · 预设 · 会话 · 双因素认证
演示
完整的悬停播放导览位于登录页面(docs/index.html)。一些截图:
聊天与智能体
深度研究
对比
文档
笔记与任务
快速开始
默认配置开箱即用——克隆、运行、在应用内配置。 首次登录后打开设置面板,将Odysseus指向你的LLM服务器、搜索提供商、电子邮件账户等。仅当你需要覆盖部署级别的设置(如AUTH_ENABLED、DATABASE_URL或预置ODYSSEUS_ADMIN_PASSWORD)时才需要修改.env文件(否则会在首次启动时生成并打印初始密码)。
选项1:Docker(推荐)
`bash
git clone <你的-odysseus-仓库-url>
cd odysseus
cp .env.example .env # 可选,但建议用于显式默认值
docker compose up -d --build
`
Compose会启动Odysseus、ChromaDB、SearXNG和ntfy。首次运行会进行完整的镜像构建。容器健康后,打开http://localhost:7000。
食谱远程服务器使用Docker内./data/ssh中Odysseus拥有的SSH密钥。在食谱 -> 设置 -> 服务器中,生成/复制公钥并将其添加到远程服务器的~/.ssh/authorized_keys。生成密钥后,你也可以从主机使用以下命令安装:
`bash
ssh-copy-id -i data/ssh/id_ed25519.pub user@server
`
食谱本地下载存储在./data/huggingface中,挂载为Odysseus容器内的~/.cache/huggingface。
有用的检查命令:
`bash
docker compose ps
docker compose logs --tail=120 odysseus
docker compose logs odysseus | grep -E 'ChromaDB|MemoryVectorStore|DEGRADED'
docker compose exec odysseus python -c "from services.hwfit.models import get_models; print(len(get_models()))"
`
Docker中预期的向量记忆启动日志行:
`
ChromaDB connected: chromadb:8000
MemoryVectorStore initialized
`
食谱模型目录检查应打印非零计数。如果打印0,请使用docker compose build --no-cache odysseus重建Odysseus镜像。
选项2:手动安装——Linux / macOS
要求:Python 3.11+。在Linux/Termux上,食谱还需要tmux用于后台模型下载和服务。
首先安装系统包:
`bash
# Debian/Ubuntu
sudo apt install tmux
# Arch sudo pacman -S tmux
# Fedora
sudo dnf install tmux
`
然后安装Odysseus:
`bash
git clone <你的-odysseus-仓库-url>
cd odysseus
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python setup.py # 创建数据目录并打印初始管理员密码
uvicorn app:app --host 0.0.0.0 --port 7000
`
选项3:手动安装——Windows(PowerShell)
`powershell
git clone <你的-odysseus-仓库-url>
cd odysseus
python -m venv venv
venv\Scripts\Activate.ps1
pip install -r requirements.txt
python setup.py
uvicorn app:app --host 0.0.0.0 --port 7000
`
打开http://localhost:7000,使用生成的管理员密码登录,然后在设置中配置其他所有内容。
安全说明
Odysseus是一个自托管的工作空间,拥有强大的本地工具:shell访问、文件上传、模型下载、网页研究、电子邮件/日历集成和API令牌。请将其视为管理控制台。
- 对于任何可网络访问的部署,保持AUTH_ENABLED=true。
- 不要在没有HTTPS和可信反向代理的情况下直接暴露到公共互联网。
- 将data/、.env、日志、数据库以及上传/生成的媒体文件排除在Git之外。它们默认被忽略。
- 首次启动后检查data/auth.json:禁用开放注册(除非你有意启用),只让你的账户成为管理员,并保持演示/测试账户为非管理员。
- 非管理员用户默认没有shell/Python/文件读写权限,管理员专属的路由和工具(如MCP管理、API令牌、webhook、模型/食谱服务、备份/保险库和应用设置)受管理员控制。其他功能由每个用户的权限控制,因此在暴露部署前请检查每个用户的权限。
- 轮换任何曾经粘贴到共享聊天、演示、截图或日志中的API密钥或令牌。
- 如果你启用API令牌或webhook,请为每个集成创建单独的令牌,并删除未使用的令牌。
- 优先将手动开发运行绑定到127.0.0.1;仅在你有意需要LAN/反向代理访问时才绑定到0.0.0.0。
- 在发布分支之前,运行git status --short并确认没有来自.env、data/、logs/、uploads、backups或本地数据库的私有文件被暂存。
将其置于HTTPS之后
Odysseus在其端口上提供纯HTTP服务。这对于localhost和可信的LAN/VPN使用来说没问题,但浏览器会警告("密码字段存在于不安全的页面上"),并且登录信息和API令牌以明文传输。对于任何可访问你机器之外的内容——包括与其他设备共享的Tailscale IP——请在前面放置一个TLS终止的反向代理。
使用Caddy的最短路径(自动续期Let's Encrypt证书):
`
odysseus.example.com {
reverse_proxy localhost:7000
}
`
对于仅LAN的Tailscale部署,Caddy + tailscale-cert或内置的MagicDNS HTTPS功能都可以工作。nginx/Traefik配置类似——代理localhost:7000,在代理处终止TLS。一旦设置完成,浏览器警告就会消失,你的登录信息也会被加密。
贡献
欢迎帮助。最好的切入点是新安装测试、提供商设置错误、移动端/编辑器优化、文档和小型专注的重构。请参阅ROADMAP.md获取当前的求助列表。
配置
大多数设置是在应用内通过/setup或设置完成的。使用.env文件设置部署级别的默认值和希望在首次启动前存在的密钥。
关键设置:
| 变量 | 默认值 | 描述 | |------|--------|------| | LLM_HOST | localhost | 你的LLM服务器(例如 llm-host.local:8000) | | LLM_HOSTS | -- | 用于模型发现的逗号分隔列表 | | OPENAI_API_KEY | -- | 可选的OpenAI密钥。除非预置,否则建议在应用内添加提供商。 | | SEARXNG_INSTANCE | http://localhost:8080 | SearXNG URL。Docker会覆盖为http://searxng:8080。 | | AUTH_ENABLED | true | 启用/禁用登录 | | LOCALHOST_BYPASS | false | 仅用于开发的回环请求认证绕过。对于共享/网络部署保持为false。 | | DATABASE_URL | sqlite:///./data/app.db | 数据库连接字符串 | | CHROMADB_HOST | localhost | 用于向量记忆的ChromaDB主机。Docker会覆盖为chromadb。 | | CHROMADB_PORT | 8100 | 手动主机运行的ChromaDB端口。Docker会覆盖为8000。 | | EMBEDDING_URL | -- | OpenAI兼容的嵌入端点 |
捆绑服务
Docker Compose默认包含以下服务:
- ChromaDB → 用于语义记忆的向量存储。在Docker中,Odysseus连接到chromadb:8000;从主机暴露为localhost:8100。 - SearXNG → 用于网页搜索的元搜索。在Docker中,Odysseus连接到searxng:8080;从主机仅暴露在127.0.0.1:8080。 - ntfy → 本地通知服务,暴露为localhost:8091。
可选的外部服务:
- Ollama → 本地LLM服务器 -- ollama.ai
架构
`
app.py # FastAPI入口点
core/ auth, database, middleware, constants
src/ llm_core, agent_loop, agent_tools, chat_processor, search/
routes/ chat, session, document, memory, model … endpoints
services/ docs, memory, search, hwfit (Cookbook) …
static/ index.html + app.js + style.css + js/ (模块化前端)
docs/ 登录页面 (index.html) + 预览片段
`
数据
所有用户数据都存储在data/(被git忽略)中:app.db(会话、消息、文档)、memory.json、presets.json、uploads/、personal_docs/、chroma/、settings.json。
许可证
MIT——请参阅LICENSE和ACKNOWLEDGMENTS.md。