Skip to content

Per-Dot model and reasoning effort, and optional recall before every turn - #188

Open
vchaindz wants to merge 2 commits into
CopilotKit:mainfrom
vchaindz:feat/per-dot-model-and-auto-recall
Open

vchaindz wants to merge 2 commits into
CopilotKit:mainfrom
vchaindz:feat/per-dot-model-and-auto-recall

Conversation

@vchaindz

@vchaindz vchaindz commented Nov 7, 2026

Copy link
Copy Markdown

Why

Two problems from running OpenDots daily with a voice Dot and a chat Dot against Ollama Cloud:

  1. One model for every Dot. OPENAI_MODEL served both, so a voice Dot that needs a fast non-thinking answer and a research Dot that benefits from reasoning had to share one model and one thinking level.
  2. Memory depended on the model choosing to look. With a memory server connected over MCP (Second Brain), a long voice thread stopped calling recall. The same question was answered "nothing stored" six times while the server held the answer. A fresh thread answered correctly, so the tool and data were fine.

What

Per-Dot model (commit 1)

  • Optional model and reasoningEffort on a Dot. Empty inherits OPENAI_MODEL and the model default.
  • dot-agent builds its adapter from dot.model and sends reasoning_effort through modelOptions, which the OpenAI-compatible adapter already spreads into the request body.
  • Two inputs in the Edit specialist dialog. updateDot keeps both values when a patch omits them and clears them on an empty string, so callers sending the old shape change nothing.

Recall before every turn (commit 2, off by default)

  • A per-Dot autoRecall toggle. When on, the server calls the Dot's connected recall tool with the latest user message before the model runs.
  • It uses only a tool the server marks read-only and the owner has not put behind approval. It waits at most 4 seconds, and any failure leaves the turn running without memory.
  • The result is attached to the latest user message, not the system prompt. In the system prompt it lost to recent history: the stuck thread kept saying "nothing stored" with the memory in hand. Attached to the question, it answered correctly twice in a row in that same thread. Stored history is not changed.

Verification

  • Format, lint, typecheck, 359 tests, and build pass. Knip reports the same findings as main.
  • New tests: tests/auto-recall.test.ts (tool selection, approval and read-only gating, failure paths, message attachment) and a WorkspaceStore test for both new columns across omitted and clearing patches.
  • Measured against Ollama Cloud with reasoning_effort:
model, effort latency reasoning chars
deepseek-v4.1-flash, none 0.5 s 0
kimi-k3.1-pro, low 1.9 s 122
gpt-oss:120b, medium 0.7 s 405

Not covered: no UI test for the new dialog inputs, and narrow-screen layout was not checked in a browser.

🤖 Generated with Claude Code

vchaindz and others added 2 commits November 7, 2026 13:28
One OPENAI_MODEL served every Dot, so a fast voice Dot and a research
Dot had to share one model and one thinking level. Each Dot now carries
optional model and reasoningEffort columns; empty inherits OPENAI_MODEL
and the model default. dot-agent builds its adapter from dot.model and
sends reasoning_effort through modelOptions, which the OpenAI-compatible
adapter already spreads into the request body. Ollama's /v1 endpoint
reads reasoning_effort, with "none" switching thinking off where the
model allows it.

updateDot keeps both values when a patch omits them and clears them on
an empty string, so API callers that send the old shape change nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Whether a Dot answered from memory depended on the model choosing to call
recall, and in a long voice thread it stopped choosing to: the same
question was answered "nothing stored" six times while the memory server
held the answer. With autoRecall on, the server calls the Dot's connected
recall tool with the latest user message before the model runs.

The result rides on the latest user message, not the system prompt: in
the system prompt it lost to recent history, and a thread whose last
answers said "nothing stored" kept saying so with the memory in hand.
Stored history is not changed.

It uses only a recall tool the server marks read-only and the owner has
not put behind approval, waits at most 4 seconds, and any failure leaves
the turn running without memory. Off by default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant