Integration guide

Odysseus

Odysseus is a self-hosted workspace for chat, agents, research, documents and notes. Add legit2compute as one model endpoint and every chat, agent and research run in your workspace can use our models, billed per token to your key.

Base URL (OpenAI-compatible)
https://api.legit2compute.com/nodes/llm/v1
API key
l2ck_… from /developers
Recommended model
qwen3.8:27b
Context window
131,072 tokens
Sign in and the snippets on this page fill in your own key.

1. Run Odysseus

Follow the Odysseus quick start:

shell
git clone https://github.com/odysseus-dev/odysseus.git
cd odysseus
cp .env.example .env
docker compose up -d --build

Open http://localhost:7011 and sign in as the admin (the first password is printed in docker compose logs odysseus).

2. Add legit2compute as a model endpoint

  1. Copy your l2ck_ key from legit2compute.com/developers.
  2. In Odysseus, open Settings, go to the models section and add an endpoint (you need to be the admin).
  3. Base URL: https://api.legit2compute.com/nodes/llm/v1
  4. API key: your l2ck_ key. Odysseus stores it encrypted and never shows it again.
  5. Save. Odysseus reads our model list from /v1/models, including each model's context window.
  6. Pick qwen3.8:27b as your default chat model. To keep the picker short, pin just the models you want on this endpoint.

3. Turn on native tool calls

For an endpoint added by hand, Odysseus decides on its own whether to send tools natively or as text, and there is no switch for it in the UI yet. Our models support native tool calls, which agents use more reliably, so tell Odysseus. Signed in as the admin, run this in your browser's developer console on the Odysseus tab:

browser console
// 1. find the endpoint's id
fetch('/api/model-endpoints', { credentials: 'same-origin' }).then(r => r.json()).then(console.log)

// 2. mark it as supporting native tools (replace ENDPOINT_ID)
fetch('/api/model-endpoints/ENDPOINT_ID', {
  method: 'PATCH',
  credentials: 'same-origin',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ supports_tools: true }),
}).then(r => r.json()).then(console.log)

Setting supports_tools back to null returns the endpoint to Odysseus' automatic choice.

Things to know

  • Embeddings are not offered by our gateway. Keep Odysseus' default embedding setup (its local fallback works with no configuration).
  • Media. Odysseus has no documented way yet to import an outside skill, so our media skill is not part of this guide. Render media from the chat, the API, or an agent that reads skills (see the Hermes and OpenClaw guides).
  • 503 with "warming": true: the model is being loaded. Retry in a minute or use a resident model.
  • 402: out of credit. Top up at /developers. Per-request spend is on your activity page.

Models that suit Odysseus

Model IDContextTakes images$ / 1M in · out · cachedNow
llama3.1
Llama 3.1 8B
128K— $0.016 · $0.032 · $0.008 resident
ornith-1.5:9b
Ornith 1.5 9B (vision, 256K)
256Kyes $0.050 · $0.080 · $0.020 resident
ornith-1.5:35b
Ornith 1.5 35B (vision, 256K)
256Kyes $0.18 · $0.30 · $0.050 on demand
qwen3.8:27b
Qwen3.8 27B (vision + text)
128Kyes $0.12 · $1.50 · $0.030 resident
llama3.1:70b
Llama 3.1 70B
128K— $0.32 · $0.32 · $0.10 on demand
deepseek-ocr:3b
DeepSeek-OCR 3B
128Kyes $0.040 · $0.060 · $0.020 on demand
granite4.1:3b
Granite 4.1 3B (text)
128K— $0.040 · $0.060 · $0.020 on demand

Tool calling and at least 64K context, from the live catalog. A model that is not resident answers 503 with "warming": true for a minute or two while it starts; the resident ones answer straight away.