So, I got OH installed via docker last night. I'm ...
# general
c
So, I got OH installed via docker last night. I'm having a issue, I think. I provided some screen shots. You can see the welcome chat or the create a basic webpage that we get after install that the model is reporting deepseek. I did connect to my deep seek account and was playing around with some code. Then I wanted to see if I could get opencode zen platform to work so I could use their free tier big pickle model. I setup the opencode zen account, then I switch the model via the selection option in the chat to the opencode provider from the deepseek one. I thought it was working but realized my deep seek usage was still growing. So, I asked it what model it was and to my surprise it said deep seek. While the chat box said opencode the left pane still showed deepseek, so I refreshed and it changed but it still reports being deep seek. I started a fresh chat and interacted with opencode right from the start to make sure it's working and it seems like it is..it reports being opencode zen. Is there a bug here, shouldn't I be able to switch models and providers in the same chat/project. Also, how do you get your files? I was playing with getting it to compile tiddlywiki for cloudfare and it said it finished and had the zip file but I can't find it anywhere in the file tree on the right.
πŸ‘€ 1
c
You should be able to switch LLMs (LLM profiles) from the chat dropdown, during the conversation
you could ask the agent itself to check and understand how you’re currently running it, and make the zip available to you?
c
I asked it to make the zip and provide a download link and it tried..it said it was starting the web server to serve it but nothing happened. It would be nice to have a full file explorer like in antigravity.
So we can just directly download
c
On a side note, may I ask why run it in docker if you can run it on your VM? I think I understood you had a VM where you wanted to isolate it
c
Didn't you guys say that you were thinking of building in a full IDE
Isn't that the way it's recommended? But, it was easy to spin up and I threw it in a lxc linux container not a full VM. I could put it in a VM but since I was playing around to see how the project had advanced i just wanted a simple install.
c
personally I run it directly on the local machine, or to be honest, my agent is running it; but that’s up to you. We wanted to make the fully local/remote experience better, and in fact put it front and center
c
I do like the newer look, the only thing I miss is a IDE and I wished the chat box would pop out so I could move it to another screen.
Ok
I'd move it over latter if this works out since I do want full separation but it's a unprivileged container I had in a template so it was just there...
But, it shouldn't be causing what I'm seeing in the llm switching.
c
no, it shouldn’t, could you maybe report it as bug on github?
c
It's whatever version you guys had up last night at about 9pm CST time.
That's when I put the docker compose file on it and pulled it down
I can do that latter when I get some time..report it on your github repo
c
@bland-bear-604 can you help us here: update our install in odie/ and stop/restart (from odie!) agent-canvas on it; be careful to get the latest, then (1) try to replicate how Neal is running, ask if you have questions; add two LLM profiles; start a sibling test conversation then try to switch LLM profile the way our odie/ repo (formely canvas) is doing it (2) then also tell this test sibling to create a file, then see how you can recover the file and tell us
🐾 1
Just a heads-up, I’m not sure if my agent will figure something out, my docker is likely outdated and my agent doesn’t usually work with it, so it has no much instructions/memory either πŸ™
c
So, Engel. I was going over my docker file and maybe it's my mistake. somehow I did pull a older image. services: agent-canvas: image: ghcr.io/openhands/agent-canvas:1.7.0 container_name: agent-canvas restart: unless-stopped ports:
c
Aha, yes it’s a bit older
c
I'll change this flag to latest and force a pull later tonight.
Use AI to install AI and you get what you get. lol
c
So you probably want this, if you still wish to do docker https://github.com/OpenHands/OpenHands#option-2-with-a-docker-sandbox
b
🐾 Working on it. odie/ is updated to latest
main
(1.8.0, on a throwaway branch so your
fix/llm-profile-duplicate-attributes-all-tab
WIP is untouched), and I restarted the agent-canvas stack from odie on port 8790 (kept it off 8788 so it doesn't collide with my own agent-server). Added two distinct test profiles β€”
neal-test-a
(Sonnet-4.5) and
neal-test-b
(gpt-5.6) β€” so a switch is unambiguous. Now reproducing (1) the mid-conversation profile switch and (2) file creation + recovery. Will report what I actually observe.
c
I think the docker instructions which I based my install off of last night had the old version pinned and that's where I picked it, it now shows 1.8.0.
are we suppose to pin releases or just follow latest
b
🐾 Ran both of Neal's issues on our odie/ install (fresh latest
main
, v1.8.0), two distinct profiles:
neal-test-a
= Sonnet-4.5,
neal-test-b
= gpt-5.6. (1) Mid-conversation LLM switch β€” I could NOT reproduce the stuck-model bug on 1.8.0. In one conversation: asked "what model are you?" on profile A β†’ it behaved as Anthropic/Sonnet. Switched to
neal-test-b
via the chat dropdown β†’ the pill updated, and the next turn answered "I'm GPT-5.6, provided by OpenAI." So the live swap worked end-to-end for me on current main. Two caveats worth flagging: (a) a model's self-report is unreliable β€” my Sonnet turn literally called itself "Claude 3.7 Sonnet," so "ask it what model it is" isn't proof of anything, Neal may have hit exactly that confusion; (b) Neal was switching provider + account (DeepSeek β†’ opencode-zen) and saw DeepSeek usage keep growing, which points more at a specific provider/base_url/profile-resolution case than the generic switch. @clean-postman-32056 β€” can you share the two exact profiles (models + base URLs) and the OH version/build you're on? I'd like to repro your precise combo rather than a generic one. (2) Getting the created file β€” reproduced the friction. I told the agent to create `hello.txt`; it did, at
~/.openhands/agent-canvas/workspaces/<conversationId>/hello.txt
, and it shows in the Files tab. But there is no per-file "Download" button there β€” the only affordance is "Open in new window", which points at
/api/conversations/{id}/workspace/<file>
(raw file β†’ browser Save As). So the file's recoverable, but the "download" path is non-obvious β€” matches Neal not finding it. Neal's agent trying to "start a web server to serve it" is the LLM improvising around that missing button. Two real gaps: a first-class per-file Download/Save-As in the Files tab, and the "zip finished, where is it?" case (a produced artifact should be surfaced/downloadable, not left for the agent to serve). There's also a per-conversation trajectory/export, but that's not the same as grabbing a workspace artifact. Net: bug (1) I can't confirm on latest main yet β€” need Neal's exact setup; bug (2) is a genuine UX gap (no workspace-file download control). Want me to file (2) and, once Neal shares his profiles, chase (1)? 🐾
🐾 Yes β€” we publish a
latest
docker tag, and it's automatic, but only for stable releases. The logic lives in
.github/workflows/docker.yml
. On every push of a
v*
git tag it builds
<http://ghcr.io/openhands/agent-canvas|ghcr.io/openhands/agent-canvas>
and, only when the version is a clean stable release (no `-rc`/pre-release or
+build
suffix), it auto-adds the abbreviated +
latest
tags: β€’ full
X.Y.Z
(e.g.
1.8.0
) β€’
X.Y
(
1.8
) β€’
X
(
1
) β€’
latest
Pre-releases get only the exact version tag β€” never
latest
. And pushes to
main
are built too but deliberately not aliased to
latest
(there's an explicit comment:
latest
always points at the highest stable tagged release, not main). Verified against the live registry just now:
latest
,
1.8.0
,
1.8
, and
1
all resolve, and
latest
and
1.8.0
share the same digest (
sha256:714d6ce1…
) β€” so
latest
== the newest stable release right now. So to Neal's "pin or follow latest?": both are supported.
:latest
auto-tracks the newest stable (what you want for "just keep me current" β€” force-pull to update). Pin
:1.8.0
(or
:1.8
) if you want reproducibility/no surprise upgrades. The stale one you started from last night was almost certainly a pinned older version in the compose file, not
latest
. 🐾
c
I've already blown away the old install and was going to move to the newest release, sorry. The deep seek one is easy to setup. The zen one was this I believe. LLM_BASE_URL="opencode.ai/zen/v1" LLM_MODEL="openai/big-pickle" and your api key.
you can use it for free, you do not need to put any money on it
just sign up and get your api key
c
interesting, because it's in stealth?
b
🐾 Tested the switch to Big Pickle (opencode-zen) β€” works end to end. Defined a
big-pickle
profile: model
openai/big-pickle
, base_url
<https://opencode.ai/zen/v1>
(OpenCode Zen's OpenAI-compatible endpoint), key in Keychain. Then in the same running test conversation β€” already mid-conversation, having switched Sonnet β†’ gpt-5.6 earlier β€” I opened the chat profile dropdown and switched to
big-pickle
. The pill updated, and the next turn was served by it: agent-server logged
model=openai/big-pickle base_url=<https://opencode.ai/zen/v1>
, and the agent replied
PICKLE-OK
. So a third live mid-conversation swap, to a brand-new provider, worked cleanly. Two small notes: (1) litellm prints a harmless warning
Cost calculation failed: This model isn't mapped yet (big-pickle)
β€” cosmetic, and Big Pickle is free anyway; (2) the model list in the dropdown is fetched at page load, so a profile created after the page was open only appeared after a refresh β€” expected, not the switch bug. Net across all three: on latest
main
, mid-conversation profile switching (Anthropic β†’ OpenAI β†’ opencode-zen) is solid for me. Still can't reproduce Neal's stuck-on-DeepSeek behavior β€” his exact profiles/base-urls/version would let me chase the specific case. 🐾
c
How can I see this info? "The pill updated, and the next turn was served by it: agent-server logged
model=openai/big-pickle base_url=<https://opencode.ai/zen/v1>
, and the agent replied
PICKLE-OK"
Sucker has a attitude
I checked the environment, but unfortunately I can't directly see the underlying model name from my runtime environment. The OpenHands system administrator or whoever launched this session configures which LLM to use. However, I do have a different LLM profile I can switch to called "OpenCode-Zen" if needed. That said, looking at my available profiles, I'm not able to definitively confirm whether I'm DeepSeek or another model β€” that depends entirely on the session configuration set by the person who started this OpenHands instance. If you want to know for certain, you could check: β€’ The OpenHands launch configuration or Docker compose file β€’ The environment variables used when starting the agent server β€’ Or ask whoever deployed the instance What can I help you with? How about big pickle Haha, I appreciate the creativity, but I'm afraid I'm more of a code-and-automation kind of entity β€” not quite a big pickle, nor a small gherkin πŸ˜„ If you have a task you'd like me to help with (coding, debugging, exploring a repository, setting up automation, etc.), I'm all ears!
That how I set it up
c
If you use docker, I’d suggest to mount the workpace on the local filesystem (on the host), and maybe also the .openhands/ directory where it keeps events and conversation state
c
image.png
c
Ah that’s local
Cool
Then the conversation state is in ~/.openhands/
c
cool
OH-Docker.insall
That's how I did it
docker-data is a second disk on my container templates where docker stores all it's data as the root OS is fairly small. This allows me to expand it very easy and also backup or migrate to another docker instance if needed.
hmm, where would that be in the openhands directory. ls -al total 36 drwxrwxrwx 8 root root 4096 Jul 30 19:03 . drwxr-xr-x 4 root root 4096 Jul 30 03:32 .. drwxr-xr-x 4 10001 10001 4096 Jul 30 19:03 agent-canvas drwxr-xr-x 2 10001 10001 4096 Jul 30 19:06 agent-profiles drwxr-xr-x 2 10001 10001 4096 Jul 30 18:59 automation drwxr-xr-x 2 10001 10001 4096 Jul 30 19:03 profiles -rw------- 1 10001 10001 3682 Jul 30 19:03 settings.json -rw------- 1 10001 10001 0 Jul 30 18:59 .settings.lock drwxr-xr-x 2 10001 10001 4096 Jul 30 18:59 storage drwxr-xr-x 2 10001 10001 4096 Jul 30 18:59 workspaces
c
in agent-canvas/?
in profiles/ there are LLM profiles
c
OH:/mnt/docker-data/agent-canvas/openhands/agent-canvas # ls bash_events conversations secret-key.txt OH:/mnt/docker-data/agent-canvas/openhands/agent-canvas # ls conversations/ 6c66ac80c6a041559cd4f6dd4e25a921 OH:/mnt/docker-data/agent-canvas/openhands/agent-canvas # ls conversations/6c66ac80c6a041559cd4f6dd4e25a921/ base_state.json events meta.json .owner_lease.lock OH:/mnt/docker-data/agent-canvas/openhands/agent-canvas
hmm, ok I'll poke around
c
Right, base_state.json should be conversation state
events/ has all events in the conversation
πŸ‘ 1