Files
wehub-resource-sync 9e8f1bbeed
Dashboard / frontend (push) Failing after 0s
Dashboard / api (push) Failing after 0s
Lint PowerShell / powershell-lint (ubuntu-latest) (push) Failing after 1s
Python Lint / Lint Python with Ruff (push) Failing after 1s
ShellCheck / Lint shell scripts (push) Failing after 1s
Matrix Smoke / linux-smoke (push) Failing after 1s
Matrix Smoke / distro: cachyos (push) Failing after 15s
Matrix Smoke / distro: linux-mint-21.3 (push) Failing after 15s
Matrix Smoke / distro: debian-12 (push) Failing after 5m21s
Matrix Smoke / distro: fedora-41 (push) Failing after 4m56s
Matrix Smoke / distro: ubuntu-24.04 (push) Failing after 2m13s
Matrix Smoke / distro: rocky-9 (push) Failing after 10m39s
Matrix Smoke / distro: manjaro (push) Failing after 12m11s
Matrix Smoke / distro: opensuse-tw (push) Failing after 11m53s
Matrix Smoke / distro: archlinux (push) Failing after 20m3s
Matrix Smoke / distro: ubuntu-22.04 (push) Failing after 13m49s
Validate .env Schema / tier-1-env-validation (push) Successful in 52s
Validate .env Schema / tier-2-env-validation (push) Successful in 44s
Validate .env Schema / tier-3-env-validation (push) Successful in 52s
Validate .env Schema / tier-4-env-validation (push) Successful in 51s
Validate Extensions Catalog / Check catalog is up-to-date (push) Failing after 9m47s
Secret Scan / Scan for secrets (push) Failing after 21m4s
Validate Docker Compose / Validate Docker Compose files (push) Has been cancelled
Python Type Check / Type check with mypy (push) Has been cancelled
Validate .env Schema / tier-0-env-validation (push) Has been cancelled
Test Linux / integration-smoke (push) Has been cancelled
Lint PowerShell / powershell-lint (windows-latest) (push) Has been cancelled
Matrix Smoke / macos-smoke (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:33 +08:00

6.9 KiB

ODS Mode Switch

One-command switching between local, cloud, and hybrid LLM modes.


Quick Start

# Check current mode
ods mode

# Switch to local mode (llama-server, requires GPU)
ods mode local

# Switch to cloud mode (LiteLLM + API keys, no GPU needed)
ods mode cloud

# Switch to hybrid mode (local primary, cloud fallback)
ods mode hybrid

# Restart to apply
ods restart

How It Works

One env var (LLM_API_URL) controls where all services send LLM requests. Three modes are user-selectable via ods mode; a fourth (lemonade) is auto-configured by the installer on AMD hardware today. The maintainer contract for provider modes lives in Engine Provider Modes.

Mode LLM_API_URL ODS_MODE LiteLLM config
local http://llama-server:8080 local config/litellm/local.yaml
cloud http://litellm:4000 cloud config/litellm/cloud.yaml
hybrid http://litellm:4000 hybrid config/litellm/hybrid.yaml

All compose files reference ${LLM_API_URL:-http://llama-server:8080}, so existing installs work without changes.


Modes

Local Mode (default)

All inference runs on your hardware via llama-server.

Aspect Details
LLM llama-server (GGUF models)
Cost $0 (electricity only)
Requires GPU or CPU with sufficient RAM
Web Search via SearXNG
ods mode local

Cloud Mode

LLM requests routed through LiteLLM to cloud APIs.

Aspect Details
LLM Claude, GPT-4o, MiniMax via LiteLLM
Cost ~$0.003-0.06/1K tokens
Requires Internet, API keys
GPU Not needed
ods mode cloud

Required .env variables:

ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...

Hybrid Mode

Local llama-server as primary, cloud APIs as fallback via LiteLLM.

Aspect Details
LLM Local first, cloud on failure
Cost $0 normally, cloud rates on fallback
Requires GPU + API keys (recommended)
ods mode hybrid

Lemonade Mode (AMD — auto-configured)

Not user-switchable. This mode is automatically set by the installer on AMD hardware. ods mode does not accept lemonade as an argument — only the installer sets it.

All LLM traffic routes through the LiteLLM proxy, which delegates to the Lemonade SDK (lemonade-server). The dashboard API uses a distinct /api/v1 URL prefix in this mode (instead of /v1).

Aspect Details
LLM Lemonade SDK via LiteLLM proxy
Cost $0 (local inference)
Requires AMD GPU (auto-detected at install time)
Set by Installer (Phase 06), not ods mode

For AMD Strix Halo performance tuning (GRUB, kernel module, sysctl settings), see config/system-tuning/README.md.

Existing Lemonade SDK installs on Linux AMD hosts can be wrapped without letting ODS manage the Lemonade runtime. See Lemonade SDK Compatibility. Future Lemonade work should follow the provider-mode contract rather than adding one-off installer or dashboard paths.


.env Variables

Variable Default Description
ODS_MODE local Active mode: local, cloud, or hybrid; lemonade is auto-set on AMD (not user-switchable)
LLM_API_URL http://llama-server:8080 Where services send LLM requests
ANTHROPIC_API_KEY (empty) Anthropic API key (cloud/hybrid)
OPENAI_API_KEY (empty) OpenAI API key (cloud/hybrid)
TOGETHER_API_KEY (empty) Together AI API key (optional)
MINIMAX_API_KEY (empty) MiniMax API key (optional, cloud/hybrid)

Installer: --cloud Flag

Install in cloud mode (skips GPU detection and model download):

./install-core.sh --cloud

This sets ODS_MODE=cloud, LLM_API_URL=http://litellm:4000, and auto-enables the LiteLLM extension.


Model Management

# Show current model
ods model current

# List available tiers
ods model list

# Swap to a different tier
ods model swap T3

For Dashboard downloads, loading catalog models, and manual GGUF swaps, see MODEL-MANAGEMENT.md.


Architecture

Local Mode

User -> Open WebUI -> llama-server (local) -> Response

Cloud Mode

User -> Open WebUI -> LiteLLM -> Cloud APIs (Claude/GPT-4o)

Hybrid Mode

User -> Open WebUI -> LiteLLM -> llama-server (local) -> Response
                                      |
                                 [On timeout/error]
                                      |
                                 Cloud APIs (fallback)

Files

File Purpose
config/litellm/local.yaml LiteLLM config for local mode
config/litellm/cloud.yaml LiteLLM config for cloud mode
config/litellm/hybrid.yaml LiteLLM config for hybrid mode
scripts/mode-switch.sh Backend script for mode switching
.env Stores ODS_MODE, LLM_API_URL, API keys

Data Safety

All modes share the same data volumes:

  • ./data/open-webui/ -- Conversations, users
  • ./data/qdrant/ -- Vector database
  • ./data/models/ -- Downloaded GGUF models

Switching modes preserves all data. Only the LLM routing changes.


Mode Comparison

Feature Local Cloud Hybrid Lemonade (AMD)
Internet required No Yes Yes (for fallback) No
API keys required No Yes Recommended No
GPU required Yes No Yes Yes (AMD)
Response quality Good Best Best of both Good
Cost $0 $$$ 0 or $$ $0
Privacy 100% local Data to cloud Local unless fallback 100% local

CLI Reference

# Mode commands
ods mode              # Show current mode
ods mode local        # Switch to local mode
ods mode cloud        # Switch to cloud mode
ods mode hybrid       # Switch to hybrid mode

# Model commands
ods model current     # Show current model
ods model list        # List available tiers
ods model swap T2     # Switch model tier

# Shorthand
ods m local           # Shorthand for mode local

Troubleshooting

Cloud mode: "No API keys found"

# Add your API keys to .env
ods config edit
# Add: ANTHROPIC_API_KEY=sk-ant-...
ods restart

Local mode: llama-server won't start

# Check GPU status
nvidia-smi
# Check model is downloaded
ls -la data/models/*.gguf
# Check logs
ods logs llama-server

Mode switch not taking effect

# Verify .env
grep ODS_MODE .env
grep LLM_API_URL .env
# Restart all services
ods restart

Rollback

If anything breaks, restore default behavior:

ods mode local
ods restart

Or manually edit .env:

ODS_MODE=local
LLM_API_URL=http://llama-server:8080