Rebuild the app around chat: consumer shell, chat correctness, workflow templates - #15
Rebuild the app around chat: consumer shell, chat correctness, workflow templates#15Siddhesh2377 wants to merge 25 commits into
Conversation
|
Important Review skippedToo many files! This PR contains 278 files, which is 178 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (278)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…mode that recolours the app
… and the SDK end to end
…and carry history into tool turns
…out of recommendations
…for generation options
|
CI resolves the published It is not a regression from any commit here: the same job has failed on every run Locally it builds and runs, because Unblocking it needs runanywhere-sdks#773 released and the pin here bumped to that |
…ult model on launch
Rebuilds the app around chat as the product, and fixes the chat correctness bugs
that surfaced once it was usable.
Consumer shell
The sidebar carries conversations and a Chat/Workflow switcher; Manage Models and
Settings moved to the footer. More is hidden entirely outside developer mode, and
Settings hides the default-model pickers there too, since in user mode the
recommendation engine chooses per device and those screens fall back on their own
when nothing is set.
Model names lose their quantisation suffixes, browsing is grouped by publisher and
category with the grouping under the reader's control, and chat is gated behind
having a model to talk to rather than failing at the first message.
Chat correctness
Four separate faults, all of them the app calling the SDK with options that meant
the opposite of what the screen intended.
ReasoningOptionswas left unset when the thinking toggle was off. Unset is notoff: with a thinking-capable model commons reads it as "reasoning might be
coming" and withholds the whole answer waiting for a closing tag that a plainly
answering model never sends. Nothing streamed and the turn landed in one lump.
includeInOutputwas never set, and thought tokens are dropped at the ABIboundary without it, so the Thinking disclosure could not fill while streaming
and a turn routed to the reasoning channel came back empty.
There was no system prompt at all. There is one now, composed rather than
substituted: the assistant instruction always, a scoped reasoning clause when
thinking is on, and the tool contract appended when tools are on. The tool path
used to pass
ChatTools.skillas the entire prompt, which replaced the model'sidentity with a page about
web_research.Tool-enabled turns dropped the conversation.
generateWithToolstakes ahistoryparameter that was never passed, so with web search on every turn was acold start and a follow-up had nothing to resolve "it" against.
Measured on the same turn and model, before and after: one delta became 82 with
thinking off and 242 with it on; a 7,837-character reply that was the model
arguing with itself became "Hello! How can I help you?" with 943 characters of
reasoning in its own channel.
Apple's built-in model
HardwareTierResolvercollapsed the SDK's precise reason to aBool, so a rowthat could not run said nothing about why. The reason now travels with the
verdict and appears on the model row and in the picker, where the row is disabled
rather than failing on tap. Separately, the recommendation back-fill ignored the
availability gate and could hand back Apple's model as an ordinary local LLM, and
its ordering was unstable because it sorted a Dictionary's values by size alone.
Workflow
Adds a template library, a node reference describing every node and its ports,
and Calendar and Reminders tools with the entitlement the sandbox needs. Workflow
LLM nodes now send the IDL defaults: commons stamps the node's system prompt onto
the same options message, which makes
has_optionstrue, and an unsettemperature then reads back as an explicit request for greedy decoding. Every
stock template set a system prompt and none set a temperature, so all of them
generated flat.
Testing
RunAnywhereAIUnitTestsruns real models off disk rather than mocking the SDK:catalog and load, streaming with reasoning on and off, the greeting turn that
used to loop, text-only and image VLM turns, transcription and synthesis, plus
the chat prompt composition rules and every workflow template.
Added after review
A read-only audit of every
RunAnywhere.*call site in the app, looking for onespecific shape: options the screen clearly intends but never sets, or sets to
something meaning the opposite. Six held up; five are fixed here and one belongs
to the SDK.
Tool-enabled turns dropped the conversation, which is described above. The image
path set no system prompt, so a photo produced "The image you have shared appears
to be a photograph…" and then hit the 320-token cap mid-answer. Document
questions left
ReasoningOptionsunset, so with a thinking model the chain ofthought streamed into the answer bubble for the whole turn and half the RAG
budget went to reasoning nobody saw. Computer Use asked for a strict
<tool_call>schema at the SDK's default temperature of 0.7, while every other structured call
site in the app pins sampling; it is greedy now. Workflow LLM nodes sent a bare
options message, and because commons stamps the node's system prompt onto that
same message,
has_optionswas true and an unset temperature read back as anexplicit 0: every stock template generated flat and a re-run of a "rewrite this"
node returned byte-identical text. They send the IDL defaults now.
The sixth is the thinking toggle on a vision model. Reasoning has no carrier
through the VLM component at all, so the toggle was a control that did nothing;
it is hidden there until the SDK can carry it.
Transcription is worth a correction. An earlier note here said speech recognition
was broken. It is not: the test took the first installed speech model, which
happened to be the one that fails. Per model,
sherpa-onnx-whisper-tiny.enandsherpa-nemo-canary-180m-flash-int8both transcribe accurately, andmlx-qwen3-asr-0.6b-8bitdoes not.test07now runs every installed speechmodel and names the ones that fail, so it cannot be misread that way again.
Still open
taken the process down before.
toggle. That is per-model, not plumbing.
Package.swiftandproject.pbxprojstill carry the local SDK path override andare deliberately not in this branch.
🤖 Generated with Claude Code