Odysseus – 自托管 AI 工作空间
Odysseus – self-hosted AI workspace

原始链接: https://github.com/pewdiepie-archdaemon/odysseus

**Odysseus** 是一个以隐私为先、可自托管的 AI 工作空间,旨在提供类似 ChatGPT 的用户界面,同时完全在您自己的硬件上运行。它提供了一种本地优先的替代方案,确保您的数据完全由您掌控。 **核心功能:** * **AI 智能体与工具:** 支持本地模型(Ollama、vLLM)及基于 API 的模型。智能体可使用内置工具执行任务,包括文件访问、网页搜索、Shell 执行和内存管理。 * **集成工作空间:** 包含基于 Markdown 的文档编辑器、电子邮件 (IMAP/SMTP) 整理、支持 CalDAV 同步的日历以及任务管理功能。 * **深度研究与对比:** 具备多步研究自动化功能,并提供盲测对比工具,可对模型进行侧面对比。 * **Cookbook:** 一款感知硬件的模型管理器,可帮助您根据显存 (VRAM) 大小下载并运行合适的模型。 * **移动端就绪:** 完全响应式的 PWA 设计,可在手机和电脑上无缝使用。 **部署方式:** Odysseus 可通过 Docker 或手动安装 Python 轻松部署。它具有高度的可扩展性,允许开发自定义技能,并可通过 ChromaDB 实现长期记忆。为确保网络访问安全,建议将其运行在具备 TLS 终止的反向代理(如 Caddy)之后。 *项目状态:基于 MIT 协议开源,开发中。*

近期的一篇 Hacker News 帖子讨论了由用户 PewDiePie-archdaemon 创建的自托管 AI 工作区“Odysseus”。尽管该项目因其概念引起了一些兴趣,但社区反应两极分化。 批评者主要集中在该项目的界面上,多名用户形容其 UI 设计“极其糟糕”,并质疑该工作区的实际可用性。一些评论者表示不解,认为为何有人会选择它而非 Open WebUI 等成熟的替代方案。与此同时,另一些人根据开发者更广泛的桌面设置推测了其审美偏好,还有人幽默地预测该项目最终可能会被风投支持的 AI 初创公司收购。
相关文章

原文

─────────────────────────────────────────────── ⊹ ࣪ ˖ ૮( ˶ᵔ ᵕ ᵔ˶ )っ Odysseus vers. 1.0 ───────────────────────────────────────────────

Odysseus

A self-hosted AI workspace -- meant to be the self-hosted version of the UI experience you get from ChatGPT and Claude. But with more jank and fun. Running on your own hardware, with your own data -- local-first, privacy-first, and no trojan.

  • Chat -- chat with any local model or API; adding them is super simple.
     vLLM · llama.cpp · Ollama · OpenRouter · OpenAI
  • Agent -- hand it tools and let it run the whole task itself.
     built on opencode · MCP · web · files · shell · skills · memory
  • Cookbook -- Scans your hardware, recommends models, click to download and serve.. easy!
     built on llmfit · VRAM-aware · GGUF / FP8 / AWQ · fit scoring · vLLM / llama.cpp serving
  • Deep Research -- multi-step runs that gather, read, and synthesize sources into a nice visual report.
     adapted from Tongyi DeepResearch
  • Compare -- a fun tool to compare models side by side. Test completely blind, no bias!
     multi-model · blind test · synthesis
  • Documents -- YOU write the text, AI is there to assist, not the opposite.
     multi-tab editor · markdown · HTML · CSV · syntax highlighting · AI edits · suggestions
  • Memory / Skills -- Persistent memory and skills, your agent evolves over time as it better understands you and your tasks!
     ChromaDB · fastembed (ONNX) · vector + keyword retrieval · import/export
  • Email -- IMAP/SMTP inbox with AI triage built in: urgency reminders, auto-tag, auto-summary, auto-reply drafts, auto-spam.
     IMAP · SMTP · per-account routing · CalDAV-aware
  • Notes & Tasks -- Quick notes with reminders, a todo list, and scheduled tasks the agent can act on.
     note pings · checklist · cron-style tasks · ntfy / browser / email channels
  • Calendar -- Local-first calendar with CalDAV sync to Radicale / Nextcloud / Apple / Fastmail.
     CalDAV pull · .ics import/export · per-calendar colors · agent-aware
  • Works on mobile -- looks and runs great on your phone, not just desktop.
     responsive · installable (PWA) · touch gestures
  • Extras -- more to explore, happy if you give it a go!
     image editor · theme editor · file uploads (vision + PDF) · web search · presets · sessions · 2FA

A full, hover-to-play tour lives on the landing page (docs/index.html). A few looks:

Chat & Agents

Deep Research

Compare

Documents

Notes & Tasks

Defaults work out of the box — clone, run, configure inside the app. Open the Settings panel after first login to point Odysseus at your LLM server, search provider, email account, etc. Only touch .env if you need to override deployment-level things like AUTH_ENABLED, DATABASE_URL, or pre-seed ODYSSEUS_ADMIN_PASSWORD (otherwise an initial password is generated and printed on first boot).

Option 1: Docker (recommended)

git clone <your-odysseus-repo-url>
cd odysseus
cp .env.example .env       # optional, but recommended for explicit defaults
docker compose up -d --build

Compose starts Odysseus, ChromaDB, SearXNG, and ntfy. First run does a full image build. Open http://localhost:7000 after the containers are healthy.

Cookbook remote servers use an Odysseus-owned SSH key from ./data/ssh inside Docker. In Cookbook -> Settings -> Servers, generate/copy the public key and add it to the remote server's ~/.ssh/authorized_keys. After generating the key, you can also install it from the host with:

ssh-copy-id -i data/ssh/id_ed25519.pub user@server

Cookbook local downloads are stored in ./data/huggingface, mounted as ~/.cache/huggingface inside the Odysseus container.

Useful checks:

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()))"

Expected vector-memory startup lines in Docker:

ChromaDB connected: chromadb:8000
MemoryVectorStore initialized

The Cookbook model catalog check should print a non-zero count. If it prints 0, rebuild the Odysseus image with docker compose build --no-cache odysseus.

Option 2: Manual install — Linux / macOS

Requirements: Python 3.11+. On Linux/Termux, Cookbook also requires tmux for background model downloads and serves.

Install system packages first:

# Debian/Ubuntu
sudo apt install tmux

# Arch
sudo pacman -S tmux

# Fedora
sudo dnf install tmux

Then install Odysseus:

git clone <your-odysseus-repo-url>
cd odysseus
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python setup.py            # creates data dirs and prints an initial admin password
uvicorn app:app --host 0.0.0.0 --port 7000

Option 3: Manual install — Windows (PowerShell)

git clone <your-odysseus-repo-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

Open http://localhost:7000, log in with the generated admin password, and configure everything else inside Settings.

Odysseus is a self-hosted workspace with powerful local tools: shell access, file uploads, model downloads, web research, email/calendar integrations, and API tokens. Treat it like an admin console.

  • Keep AUTH_ENABLED=true for any network-accessible deployment.
  • Do not expose it directly to the public internet without HTTPS and a trusted reverse proxy.
  • Keep data/, .env, logs, databases, and uploaded/generated media out of Git. They are ignored by default.
  • Review data/auth.json after first boot: disable open signup unless you intentionally want it, make only your own account admin, and keep demo/test accounts non-admin.
  • Non-admin users do not get shell/Python/file read/write by default, and admin-only routes/tools such as MCP management, API tokens, webhooks, model/cookbook serving, backup/vault, and app settings are admin-gated. Other features are controlled by per-user privileges, so review each user's privileges before exposing a deployment.
  • Rotate any API keys or tokens that were ever pasted into a shared chat, demo, screenshot, or log.
  • If you enable API tokens or webhooks, create separate tokens per integration and delete unused ones.
  • Prefer binding manual development runs to 127.0.0.1; bind to 0.0.0.0 only when you intentionally want LAN/reverse-proxy access.
  • Before publishing a fork, run git status --short and confirm no private files from .env, data/, logs/, uploads, backups, or local databases are staged.

Odysseus serves plain HTTP on its port. That's fine for localhost and trusted LAN/VPN use, but browsers will warn ("Password fields present on an insecure page") and the login + API tokens travel in cleartext. For anything reachable outside your machine — including a Tailscale IP shared with other devices — put a TLS-terminating reverse proxy in front.

Shortest path with Caddy (auto-renews Let's Encrypt certs):

odysseus.example.com {
  reverse_proxy localhost:7000
}

For a LAN-only Tailscale deployment, Caddy + tailscale-cert or the built-in MagicDNS HTTPS feature both work. nginx/Traefik configs are similar — proxy localhost:7000, terminate TLS at the proxy. Once that's in place, the browser warning goes away and your login is encrypted.

Help is welcome. The best entry points are fresh-install testing, provider setup bugs, mobile/editor polish, docs, and small focused refactors. See ROADMAP.md for the current help-wanted list.

Most setup is done inside the app with /setup or Settings. Use .env for deployment-level defaults and secrets you want present before first boot. Key settings:

Variable Default Description
LLM_HOST localhost Your LLM server (e.g. llm-host.local:8000)
LLM_HOSTS -- Comma-separated list for model discovery
OPENAI_API_KEY -- Optional OpenAI key. Prefer adding providers in the app unless pre-seeding.
SEARXNG_INSTANCE http://localhost:8080 SearXNG URL. Docker overrides this to http://searxng:8080.
AUTH_ENABLED true Enable/disable login
LOCALHOST_BYPASS false Development-only auth bypass for loopback requests. Keep false for shared/network deployments.
DATABASE_URL sqlite:///./data/app.db Database connection string
CHROMADB_HOST localhost ChromaDB host for vector memory. Docker overrides this to chromadb.
CHROMADB_PORT 8100 ChromaDB port for manual host runs. Docker overrides this to 8000.
EMBEDDING_URL -- OpenAI-compatible embeddings endpoint

Docker Compose includes these by default:

  • ChromaDB → vector store for semantic memory. In Docker, Odysseus connects to chromadb:8000; from the host it is exposed as localhost:8100.
  • SearXNG → meta search for web search. In Docker, Odysseus connects to searxng:8080; from the host it is exposed only on 127.0.0.1:8080.
  • ntfy → local notification service, exposed as localhost:8091.

Optional external services

app.py                   # FastAPI entry point
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/ (modular front-end)
docs/      landing page (index.html) + preview clips

All user data lives in data/ (gitignored): app.db (sessions, messages, documents), memory.json, presets.json, uploads/, personal_docs/, chroma/, settings.json.

MIT -- see LICENSE and ACKNOWLEDGMENTS.md.

                                  |
                                 |||
                                |||||
                  |    |    |   |||||||
                 )_)  )_)  )_)   ~|~
                )___))___))___)\  |
               )____)____)_____)\\|
             _____|____|____|_____\\\__
             \                       /
       ~^~^~~^~^~~^~^~~^~^~~^~^~~^~^~~^~^~~^~^~
               ~^~  all aboard!  ~^~
       ~^~^~~^~^~~^~^~~^~^~~^~^~~^~^~~^~^~~^~^~
联系我们 contact @ memedata.com