Repository navigation
ThinkWatch Core 0.83.1
This release fixes two cases where set.reasoning: off in a routing rule left the model reasoning.
Upgrade notes
- The control-plane protocol version stays at 54; ThinkWatch Lite releases that include 0.83.0 connect to 0.83.1 and the other way round.
- The request store's schema and the configuration are unchanged; nothing is cleared.
- No new message codes.
A refused none is resent with the lowest level. When an upstream answered 400 to the none that off writes in the OpenAI formats (for models that accept only minimal, low, medium or high), the request was resent without the effort, so the model reasoned at its default level, usually medium, and that was remembered for 7 days. The resend now uses the lowest level the error lists, such as minimal or low, and only leaves the effort out when the error lists none. Entries remembered by 0.83.0 for a refused none are kept until they expire after 7 days.
off works across a format conversion. When the client's format differed from the upstream's (for example an Anthropic client routed to an OpenAI Chat or Responses upstream), off removed the reasoning configuration before conversion, so the converted request carried no effort and the upstream reasoned at its default, while the attempt chain showed reasoning as off.
- OpenAI Chat and Responses upstreams now receive
reasoning_effort: "none"orreasoning.effort: "none", also when the client turned reasoning on without naming an effort. A refusednoneis handled as above. - Gemini 2.5 Flash upstreams receive a thinking budget of 0. Gemini models that cannot turn thinking off (2.5 Pro, Gemini 3) are sent no thinking configuration as before, and the conversion now reports the reasoning setting as dropped.
- Anthropic and Bedrock upstreams are unchanged: no thinking configuration and no effort.
AttemptView.effortrecords the effort written in the converted request. Requests in the upstream's own format are unchanged, and a rule's level is still written the way the upstream's format writes it.
Downloads
| Platform | Binary | Archive for server installation |
|---|---|---|
| Linux, x86_64 | twcore-x86_64-unknown-linux-gnu |
twcore-x86_64-unknown-linux-gnu.tar.gz |
| Linux, aarch64 | twcore-aarch64-unknown-linux-gnu |
twcore-aarch64-unknown-linux-gnu.tar.gz |
| macOS, Apple silicon | twcore-aarch64-apple-darwin |
— |
| Windows, x64 | twcore-x86_64-pc-windows-msvc.exe |
— |
| Windows, ARM64 | twcore-aarch64-pc-windows-msvc.exe |
— |
Each file is published with a .sha256 file beside it. A Linux archive contains twcore, the systemd unit twcore.service and LICENSE. ThinkWatch Lite includes its own copy of twcore; the files here are for running core separately, such as on a server.
Server installation
On Linux (x86_64 or aarch64), the install script sets up twcore as a systemd service. This installs 0.83.1:
curl -fsSL https://raw.githubusercontent.com/ThinkWatchProject/ThinkWatch-Core/main/scripts/install.sh | sudo sh -s -- --version 0.83.1An installation made with the script switches to 0.83.1 with:
sudo twcore upgrade --version 0.83.1 --restartConfiguration, the remote control port and connecting ThinkWatch Lite are described in docs/server.md.
Verifying a download
A .sha256 file holds the SHA-256 of the file followed by its name. With both files in the current directory, on Linux:
sha256sum -c twcore-x86_64-unknown-linux-gnu.tar.gz.sha256On macOS:
shasum -a 256 -c twcore-aarch64-apple-darwin.sha256On Windows, in PowerShell, the following prints True when the binary matches:
(Get-FileHash .\twcore-x86_64-pc-windows-msvc.exe).Hash -eq (Get-Content .\twcore-x86_64-pc-windows-msvc.exe.sha256).Split()[0]The install script and twcore upgrade check the SHA-256 themselves.
What's Changed
- 0.83.1: reasoning off picks the lowest accepted level and survives format conversion by @fylorn in #376
Full Changelog: v0.83.0...v0.83.1