Skip to content

ThinkWatch Core 0.83.1

Choose a tag to compare

@github-actions github-actions released this 25 Oct 08:55
· 15 commits to main since this release

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" or reasoning.effort: "none", also when the client turned reasoning on without naming an effort. A refused none is 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.effort records 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.1

An installation made with the script switches to 0.83.1 with:

sudo twcore upgrade --version 0.83.1 --restart

Configuration, 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.sha256

On macOS:

shasum -a 256 -c twcore-aarch64-apple-darwin.sha256

On 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