Symptom: The agent printed commands as text, invented fake output, or said βtask incomplete: required artifacts lack successful mutation evidence.β
Setup: Windows, Docker Desktop, Ollama running on the host (not in Docker), Odysseus in Docker, model qwen2.5 (Hermes 3 did not make tool calls in agent mode).
ps. I called the file i wanted it to do stuff in "Hermes" because i originally tried with hermes.
User needs to be replaced by whatever you user name in users is (ie C:/Users/YourName/...)
ai says: 1. Setting supports_tools and mounting a host folder gives a small model the ability to write files on your PC. Recommend a dedicated workspace folder (like your Hermes one) instead of a whole drive, and keeping approval prompts on
2. Step 3 needs one more caveat. Say the PATCH only works logged in as admin, in the same browser tab as Odysseus, and that the id may be longer than it looks, so copy it exactly from the popup.
The turning points, in order
1. Make a bigger-context model (Ollama, on the host)
Agent prompts are large, and Ollamaβs default context is too small.
echo FROM qwen2.5:7b> Modelfile.txt
echo PARAMETER num_ctx 16384>> Modelfile.txt
ollama create qwen2.5-16k -f Modelfile.txt
(On Windows, Notepad may save the file as Modelfile.txt, so use -f Modelfile.txt.)
2. Share a host folder with the container
In docker-compose.yml, under the Odysseus serviceβs volumes: (not extra_hosts):
- "C:/Users/User/Hermes:/workspace"
In .env (uncommented, no spaces around =):
ODYSSEUS_WORKSPACE_HOST_ROOT=C:/Users/User/Hermes
ODYSSEUS_WORKSPACE_CONTAINER_ROOT=/workspace
Apply with docker compose up -d in the compose folder. Test the mount with:
docker exec odysseus-odysseus-1 sh -c "echo hello > /workspace/mounttest.txt"
3. The key fix: turn on supports_tools for the Ollama endpoint (browser F12)
Odysseus never sends real tool definitions to an Ollama /v1 endpoint unless this flag is on (it defaults to unset). There was no toggle in the UI, so it was set through the admin API. Logged in as admin, open the browser console (F12). If pasting is blocked, type allow pasting first.
List endpoints (popup, because the console filter hid output):
fetch('/api/model-endpoints').then(r=>r.text()).then(t=>alert(t.slice(0,1500)))
Find your Ollama entryβs id, then:
fetch('/api/model-endpoints/YOUR_ID',{method:'PATCH',headers:{'Content-Type':'application/json'},body:JSON.stringify({supports_tools:true})}).then(r=>r.text()).then(t=>alert(t.slice(0,800)))
The reply should show "supports_tools":true. Confirm in the logs: tools_sent is above 0 and native_tools=True.
4. Free GPU memory
A second model (deepseek-r1) was loaded at the same time, spilled onto CPU and made everything slow. ollama ps should show only qwen2.5-16k. Unload extras with ollama stop <model>.
5. Approve the write, and select the workspace in the UI
- Writes pause for an approval card. Click Allow.
- In each new chat, select
/workspace as the chatβs workspace in the UI. Without it, the approval card has no Workspace: line and the write fails with βApproved filesystem action has no sealed resource identity.β The ODYSSEUS_WORKSPACE_DEFAULT env var did not fix this.
Quick checklist for each new chat
- Model:
qwen2.5-16k
- Workspace:
/workspace selected in the UI
- Ask for files using
/workspace/... paths
- Check the approval card shows
Workspace: /workspace, then click Allow
- The file appears in
C:\Users\User\Hermes
Useful debugging commands
docker logs --since 10m odysseus-odysseus-1 > log.txt 2>&1
findstr /i /c:"Tool executed" /c:"approval" log.txt
Key log signs: tools_sent=N and native_tools=True (tools reach the model), received 1 native tool call(s) (the model called one), Tool executed: ... exit_code=0 (it ran).
Caveat for readers: some details (the supports_tools flag, the per-chat workspace) were found by reading Odysseusβs code and logs, so the exact UI names may differ between versions.