Repository navigation
GuideAnts v1.2.0
Blank Office documents from the sidebar, a more reliable local AI stack, and llama.cpp v0.7.0 across all AI backends – switching the default model no longer evicts the models other assistants are running, and the whole UI now stores and transmits time in UTC and displays it in your browser's timezone.
What's new since v1.1.4
- Create blank Office documents in the sidebar (#167) – With the DocumentServer (Collabora) container live, both the notebook and project sidebars now offer to create a blank Word / Excel / PowerPoint document in the folder you're in. The client ships generated blank
.docx/.xlsx/.pptxtemplates (scripts/generate-office-templates.py), and the server reports DocumentServer reachability in its capabilities (DocumentServerHealthProbe) so the UI only shows the option when the service can actually serve it. - New OpenRouter default choices (#165) – New default models for OpenRouter-based setups: chat
deepseek/deepseek-v4.1-flash(wasminimax/minimax-m3), embeddingsqwen/qwen3-embedding-8b(wasnvidia/llama-nemotron-embed-vl-1b-v2:free), imagesbytedance-seed/seedream-4.5(wasrecraft/recraft-v4), and speech transcriptionqwen/qwen3-asr-0.6b(wasnvidia/parakeet-tdt-0.6b-v3). The known-models catalog was re-seeded to match. Existing installations keep their configured models; this only changes what the Add-AI-Services wizard and settings catalog suggest. - Installer pins release tags instead of digests (#165) – Release packaging now writes
images.envwith release-tag pins (e.g.ghcr.io/elumenotion/guideants-ai-cuda13:v1.2.0) instead of@sha256:digests, the pin-rewrite helper was simplified to pin-lookup, and the release workflow no longer sets up Docker Buildx. A newGA_AI_SPARK_IMAGEpin covers the Spark image. Digest-pulled<none>tagging is no longer needed and was removed. - llama.cpp v0.7.0 in all AI images (#176) – All six backend Dockerfiles (cpu, cuda13, rocm, slim, vulkan, spark) move from the
server-*-v0.5.0base to the v0.7.0 build (taggedserver-*-b11669– upstream publishes v0.7.0 under the build tag; noserver-*-v0.7.0tags exist on ghcr). Docling is bumped tov1.38.2in all compose files, and the SearXNG image is rebuilt from a pinned upstream source (searxng:2026.10.30-ffa88e3ba) on a pinned Playwright base (v1.64.1-noble) with a fully pinned dependency set.
Improvements
- Deliberate AI container restarts no longer raise a stale crash dialog (#175, #177) – Restarting (or stopping) the local AI sandbox mid-stream used to leave a dead stream behind whose error was re-delivered after the restart/reload, opening the "AI runtime crashed" dialog even though nothing new had failed. A crash error now only opens the dialog if a stream is genuinely in flight at the moment it's processed; stale redeliveries are dropped. After a restart the client re-observes the conversation's event stream, so an interrupted active turn resolves cleanly instead of erroring with stale state.
- Switching the default model stops evicting loaded aliases (#170) – Saving chat defaults used to reconcile the llama runtime unconditionally: any edit (temperature, sampling, reasoning) contacted every instance and unloaded every loaded alias that wasn't the new default, so one model pick in one notebook evicted models other assistants had named as their own. Reconciliation now fires only when the default model id or the override-all flag changes, and with override-all OFF the reconciler only warms the default on its own instance and leaves every other loaded alias alone. The notebook toolbar model pick also keeps the override flag exactly as the user set it.
- Embeddings jobs and per-conversation model picks wait for the local model (#168) – Background jobs that need the local embeddings engine now pass through a readiness gate that loads the persisted model before the job is claimed (concurrent callers await one in-flight load rather than firing duplicate loads; a load failure defers the claim instead of failing the job). Picking a local model for an individual conversation now loads it too, instead of failing until you loaded it manually.
- Time is stored and transmitted in UTC, displayed in the browser's timezone (#174) – The store already kept UTC, but
datetime2carries no offset, so EF read values back withKind = Unspecifiedand the wire format had noZ– JavaScript then parsed the ambiguous string as local wall-clock and rendered the wrong hour. A newUtcDateTimeJsonConverterserializes everyDateTimeas UTC with an explicitZ(and parses inbound strings into UTC), aSaveChangesguard inApplicationDbContextrejects non-UTC writes, and a new clientdateTimemodule renders every timestamp in the UI in the browser's timezone and locale. - Copying a conversation is now fast (#177) – The conversation copy loaded the source as an entity graph (messages + turns with includes), which EF rendered as a cartesian join: every message row repeated once per turn, each copy carrying every LOB column. On a measured 377-message / 12-turn conversation that streamed ~2.6 GB to the server and took 70–120 s. The copy now reads flat projections of only the ~1 MB it actually inserts.
- OpenAI-compatible provider refinements from local-engine testing (#172) – Stream requests now send the
usageflag, wire (API-attached) images are no longer sent through OCR, and script-wrapper tools sendargumentsinstead ofscriptin their schema – all changes observed to be needed by qwen3-flash-next under the Strata and Gufo engines. - Resubmission of undone turns keeps expanded image attachments (#173) – Resending an undone turn that carried image attachments now re-expands them in the outgoing message instead of dropping them.
- Model selection styling pass (#177) – Minor model-selector and label rendering updates after testing on the latest Chrome.
What's under the hood
- Llama router soft-reload for inactive aliases (#176) – Catalog edits to a model that is not currently loaded now register via a non-destructive soft reload (
GET /models?reload) instead of SIGTERMing and respawning the router, so editing an unused alias can no longer kill every active conversation. The full hard reload (stop + respawn + restore) is still used when the edited alias is the loaded/active model, and alias deletes are soft as well. - Voice-pack presets for private TTS engines (#176) – Skill-spawned private
audiocpp_serverengines now register the same server-side voice presets the GuideAnts TTS wrapper does (mirroring the voice-pack manifest,GA_TTS_VOICE_PACK_PATH, opt-out viaGA_AUDIOCPP_SKILL_PRIVATE_VOICE_PACK=0), sovoiceids likedougexist on private engines instead of every skill call being forced to stage a reference clip. --rebuild-baseis a true base rebuild again (#176) –build_guideants_ai.{ps1,sh}under-RebuildBasenow pass--pull --no-cache(the deps image's layer cache was not a meaningful cache across a base-image change). The deps image is re-pulled from upstream, the engine sources re-cloned, and only the final stage keeps its cache.- Sandbox dependency pins advanced selectively (#171) –
cairosvg 2.9.1,geopy 2.5.0,pyjwt 2.15.0,thrift 0.24.0,weasyprint 70.0in all sandbox requirement sets, plus clientvitest 4.1.11/electron 41.10.6. Some remaining pins are intentionally held pending upstream fixes. - ImageSharp removed from the server (#169) – The
SixLabors.ImageSharppackage reference and its now-unused imports are gone from the API and the chat/compaction/tool-calling projects, along with a repo-wide usings cleanup. - Attachment-only turns no longer emit an empty user message (#177) –
ThreadRunappends the user turn only when it carries text (or when nothing else in the list speaks for the user), so an attachment-only turn doesn't put an empty content part on the wire for every provider. - webapi-ui image build split (#170) – The webapi-ui Dockerfile separates
runtime-depsfromruntime-slim-depsso the apt layer is shared and cacheable, and the slim image no longer carries docker.io. - Catalog (#170) – Non-local catalog rows honor
ThinkingControlJson.defaultChoiceas the default reasoning choice (falling back to the first declared choice), openai-compatible gains the row-owned request-shaping surface in the editor, and catalog URL/key inputs have autocomplete and spellcheck disabled.
Notes
- SearXNG image must be rebuilt – The SearXNG Dockerfile was re-based from a
:latestsource onto a pinned upstream revision on the new Playwright base; the change takes effect when you rebuild/push the SearXNG support image (normal-modebuild_support_images), not on existing images. - llama.cpp base tag is
b11669– Upstream publishes llama.cpp v0.7.0 under its build tag; if you reference the base image manually, useghcr.io/ggml-org/llama.cpp:server-*-b11669(theserver-*-v0.7.0tags do not exist on ghcr). - UTC wire format – API datetime fields are now always UTC with a
Zsuffix. Consumers that previously re-interpreted offset-less strings as local time will see corrected (earlier) times; no data migration is needed – existing rows were already UTC at rest.