Commit Graph
9109 Commits
Author SHA1 Message Date
localai-org-maint-bot 8a62b90d02 docs(mcp): describe remote model and system tools
Format the HTTP route constants with gofmt.

Assisted-by: Codex:gpt-6
(cherry picked from commit 9d4b99da60)
(cherry picked from commit 367a9ff9432c84f700f3f83206fab2d7b4ed85ac)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:24:13 +00:00
L0ria 281b43a693 fix(mcp): point httpapi list_installed_models & system_info at live routes
The standalone 'local-ai mcp-server' HTTP client (httpapi.Client) called
GET / for both list_installed_models and system_info, expecting the legacy
welcome JSON (ModelsConfig / Version / InstalledBackends). That endpoint was
unregistered when the React UI moved to /app, so GET / now 301-redirects to
the SPA. The client uses LocalAI's hardened httpclient, which refuses all
redirects by default, so both tools failed with:

    Get "/app": httpclient: redirect blocked: refusing to follow redirect ...

These two tools have never returned data over HTTP (the client was added
after / became a redirect). Repoint them at live, non-redirecting routes:

  - list_installed_models -> GET /api/models/capabilities
    (returns id/backend/capabilities/disabled/pinned; also makes the
    capability filter, previously a no-op over HTTP, actually work)
  - system_info           -> GET /version + GET /backends + GET /system

The dead routeWelcome constant is removed and the three new routes are
added as route* constants per the package convention. Test fakes and the
Tool<->REST drift map in coverage_test.go are updated to the new routes,
and new specs cover list_installed_models (all / filtered / empty) and
system_info (version + backends + loaded models).

Assisted-by: LocalAI-Agent:qwen3.8-27b-heretic-abliterated-uncensored
Signed-off-by: L0ria <loria@hno3.eu>
(cherry picked from commit d123083bc0)
(cherry picked from commit f352b4278f764ad25902882d26afb761fa1b953d)
2026-11-03 19:24:13 +00:00
Ettore Di Giacinto 9e6a7a077c fix(realtime): leave speech-to-speech client commits at the session rate
The speech-to-speech path labels its transcription WAV with the session
rate for client commits, so resampling first handed it 16 kHz audio under
a 24 kHz header. Resample only in the chained pipeline, and say so in the
docs.

Assisted-by: Claude:claude-sonnet-5-5 go-test
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
(cherry picked from commit 82cc411af54cf884e4a44a3e96292a323ba5611c)
2026-11-03 19:23:38 +00:00
nexxtmobile.de fbfb2ccadf fix(realtime): resample client commits to 16 kHz before transcription
The committed-utterance WAV is written with a fixed 16 kHz header. The VAD
commit path stores audio that is already resampled to 16 kHz (vadCommit),
but the client-commit path (input_audio_buffer.commit) passed the raw
buffer at the session input rate. For a 24 kHz OpenAI Realtime session the
backend decoded 24 kHz audio as 16 kHz (1.5x speed/pitch): garbage or empty
transcripts, then input_not_committed on the follow-up response.

commitUtterance now resamples from session.InputSampleRate to
localSampleRate, so both paths hand 16 kHz audio to the 16 kHz header.
This replaces the earlier approach of this PR (header at the session rate),
which mislabelled the already-resampled VAD audio (review feedback).

Tests go through the real paths with a 24 kHz session: commitUtterance and
a server_vad commit via vadTick; both must produce a 16 kHz WAV of the
resampled length. The client-commit spec fails without the fix.

Fixes #12747

Signed-off-by: nexxtmobile.de <git@nexxtmobile.de>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 05ba891da6)
(cherry picked from commit 56e2b6d0cc5cbf1944ef50735f7b499d998eb25c)
2026-11-03 19:23:38 +00:00
rossg 71e985611a test(mcpconns): cover Streamable HTTP and legacy SSE connectors
Connecting a connector must reach both MCP transports. Adds specs that resolve a
Streamable HTTP server promptly and a legacy SSE server, through the same
mcptransport.Connect path that agent runs use.

Signed-off-by: rossg <ross@golder.org>
(cherry picked from commit 4feaf9db39)
(cherry picked from commit fab3cfa21c13747e03115d7cc39f2466962f16e8)
2026-11-03 19:23:01 +00:00
localai-org-maint-bot 2945759e6b docs(api): expose chat template kwargs in Swagger
Keep all three Swagger representations aligned with the request schema.

Assisted-by: Codex:gpt-6
Signed-off-by: Cristi An <c4xp@msn.com>
(cherry picked from commit 0e4c6ef69f)
(cherry picked from commit d0266e6dcc49eed99d77aa40fb723ab4cfa6480a)
2026-11-03 19:22:19 +00:00
Cristi An 23839b74a2 feat(api): accept request-level chat_template_kwargs
Clients written for llama-server, vLLM or SGLang switch template variables
per request with a top-level chat_template_kwargs object, most often
{"enable_thinking": false}. OpenAIRequest had no such field, so it was
dropped: with a Qwen3-style template thinking stayed on, the reply landed
in message.reasoning and content came back empty.

Fold the field's scalar values into the request metadata, so it takes the
path metadata already takes (gRPCPredictOpts, ResolveChatTemplateKwargs).
Booleans become "true"/"false", strings pass through, numbers become their
decimal string; nested values are skipped. An explicit metadata key wins.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Cristi An <c4xp@msn.com>
(cherry picked from commit 2cd7425e87)
(cherry picked from commit 5e86ad6bd5286cc8db398d278adaa32e562223ca)
2026-11-03 19:22:19 +00:00
xianshujun 45d7a967c7 fix(openai): keep answers in content when thinking is disabled
qwen3's chat template wraps <think> in {% if enable_thinking %}, but the
prefill detectors scan the raw template without evaluating the condition.
With streaming and no tools, the synthetic prefill made the Go-side extractor
classify the whole answer as reasoning whenever the client sent
metadata.enable_thinking=false.

Skip prefill detection when the request disables thinking. Real
<think>...</think> blocks that a model emits anyway are still extracted from
the content itself.

Fixes #12939

Assisted-by: ZCode:deepseek-flash
Signed-off-by: xianshujun <xianshupang@gmail.com>
(cherry picked from commit cee7ed4b32)
(cherry picked from commit 29618866d07a05624934bf9f595c95a68c938461)
2026-11-03 19:21:12 +00:00
Dedy F. Setyawan 9a704b83b7 feat(i18n): complete Indonesian translation in chat.json
Signed-off-by: Dedy F. Setyawan <dedyfajars@gmail.com>
(cherry picked from commit 2413f19b7d)

Conflict resolved against current master: keep the strings master already
has for chat.json and add the translations this change supplies for keys
master lacks. Keys added to master after the PR was opened are still
untranslated and fall back to English.

Assisted-by: Claude:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
(cherry picked from commit 8d4799d91b33b2af204e7cc5386d8b984d09f04b)
2026-11-03 19:20:44 +00:00
Ettore Di Giacinto 4129eca571 docs(cloud-proxy): keep the OrcaRouter example neutral
Drop the vendor marketing claims and the specific upstream model ids,
which go stale. Keep the working passthrough configuration.

Assisted-by: Claude:claude-sonnet-5-5
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
(cherry picked from commit eec17103b4514f1cb0f6193c3683f34f71a3d1b9)
2026-11-03 19:20:44 +00:00
XiaoHuo888-hue 48549f5701 docs(cloud-proxy): add OrcaRouter passthrough example
Document OrcaRouter as a first-class cloud-proxy upstream. It is an
OpenAI-compatible gateway, so it plugs into the existing passthrough
mode with provider: openai, mirroring the OpenAI/Anthropic examples.

Assisted-by: Claude:deepseek-v4-flash-0731
Signed-off-by: XiaoHuo888-hue <xiaohuo888hue@users.noreply.github.com>
(cherry picked from commit 329ee0ee89)
(cherry picked from commit 6b2d84294d0198bdaa2f27288993eb7cfad0b0b1)
2026-11-03 19:20:44 +00:00
Thibaut MÉLEN 9cc7b63d89 docs: add Nika to Agentic Libraries & Assistants integrations
Signed-off-by: Thibaut MÉLEN <20891897+ThibautMelen@users.noreply.github.com>
(cherry picked from commit aaf03eb042)
(cherry picked from commit 01c2a4e5477bcc6fcb92ab15c4d898f62d29ed9e)
2026-11-03 19:20:44 +00:00
Ettore Di Giacinto f7028bfe09 test(qwen3-tts-cpp): ignore the warmup error in the blocking spec
The spec only checks that warmupBatch returns once every request ends;
errcheck flags the dropped error value.

Assisted-by: Claude:claude-sonnet-5-5 golangci-lint
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:19:59 +00:00
localai-org-maint-bot 786fd13087 fix(qwen3-tts-cpp): report incomplete batch warmup
Report failed warmup requests without failing model load. Document the
warmup limits and use the reported LocalAI benchmark measurements.

Assisted-by: Codex:gpt-6
(cherry picked from commit ec50871dd6)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:19:59 +00:00
nexxtmobile.de 8c44b3de33 docs(text-to-audio): document qwen3-tts-cpp max_batch
Signed-off-by: nexxtmobile.de <git@nexxtmobile.de>
Assisted-by: Claude:claude-opus-5-5
(cherry picked from commit 074bc84f0c)
2026-11-03 19:19:53 +00:00
nexxtmobile.de 6c67012e72 feat(qwen3-tts-cpp): warm up every batch width at load
qwentts builds its code-predictor and codec-stream graphs lazily per batch
width. With max_batch > 1 the first request that hits a new width (for
example two requests finishing in the same step) stalled the whole batch
for ~5 s on an RTX 5060 Ti; afterwards the same pattern took ~1 s.

When max_batch > 1, Load now synthesizes N short utterances of increasing
length concurrently through the streaming path and discards the audio, so
the slots finish one by one and every width from N down to 1 is built
before the first real request. `max_batch_warmup:false` skips it.

Signed-off-by: nexxtmobile.de <git@nexxtmobile.de>
Assisted-by: Claude:claude-opus-5-5
(cherry picked from commit 0b7d0b40ed)
2026-11-03 19:19:53 +00:00
nexxtmobile.de 9eb1687bcf feat(qwen3-tts-cpp): batch concurrent requests via qwentts max_batch
qwentts.cpp batches concurrent qt_synthesize calls on one context when it
is initialized with max_batch > 1 (its compute worker coalesces them into
batched decode steps; qt_synthesize stays blocking and thread safe). The
LocalAI wrapper never set max_batch and serialized every request with
base.SingleThread, so concurrent /v1/audio/speech requests always ran one
after another.

- new model option `max_batch:N` (alias `parallel:N`, default 1 = current
  behavior), passed to qt_init_params.max_batch via qt3_load
- Locking() keeps LocalAI's per-backend request lock only for max_batch 1;
  with batching TTS/TTSStream reach the native worker concurrently
- TTSStream routes chunks per request: a fresh id travels as the C
  callback's user_data (one shared purego callback, as before), each request
  has its own queue drained into its channel, so the native worker never
  blocks on a slow consumer and concurrent streams cannot mix
- TTSLive rejects max_batch > 1 (qwentts incremental mode requires a
  max_batch=1 context, docs/INCREMENTAL.md)
- README: option, measurements, TTSLive limit, ROCm/gfx1201 hipBLASLt note
- unit tests: option parsing, Locking, concurrent stream routing (fails if
  requests were serialized), TTSLive rejection

Measured with qwentts' own tts-server and the 1.7B Base Q4_K_M talker,
four concurrent streaming requests, time to first PCM: RTX 5060 Ti (CUDA)
0.02/0.36/0.70/1.04 s at max_batch 1 vs 0.06 s for all four at 4;
Radeon AI PRO R9700 (ROCm, with ROCBLAS_USE_HIPBLASLT=0) 0.03/0.71/1.36/
2.02 s vs <= 0.11 s.

Signed-off-by: nexxtmobile.de <git@nexxtmobile.de>
Assisted-by: Claude:claude-opus-5-5
(cherry picked from commit da0c5435b5)
2026-11-03 19:19:53 +00:00
Stefan Walcz 2247835401 feat(config): mark links a profile answer names without retrieving them
A model can cite a plausible deep link it never opened, written from
memory. The client cannot tell it from a link a search tool returned,
because server-side MCP tool results never reach it.

evidence_check.urls compares every http(s) link of the final answer,
bare or inside a Markdown link, with the URLs of the request (system
prompt, system, user and tool messages) and of the request's successful
MCP tool results. Links are compared without scheme, fragment, "www."
and trailing slash; a link counts as retrieved when it equals an evidence
URL or is a shorter form of one at a path or query boundary. Unbacked
links (at most five) are listed in an appended note; urls_note replaces
the default note, with {urls} as the placeholder for the list.

Assistant messages are not evidence, so an invented link is marked again
when the client sends it back on the next turn.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Stefan Walcz <stefan.walcz@walcz.de>
(cherry picked from commit 523e8cd3c4)
2026-11-03 19:18:43 +00:00
Ettore Di Giacinto f4a32aacc9 test(openai): pass the compressor argument in the require_tool spec
ChatEndpoint gained a compressor parameter after the spec was written, so
the openai test package no longer compiled.

Assisted-by: Claude:claude-sonnet-5-5 go golangci-lint
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:18:43 +00:00
Stefan Walcz 052e02c75b fix(chat): keep evidence.go out of the tool consumer matrix
The comment in sourceURLs named ExecuteMCPToolCall, which the tool
consumer matrix test (core/services/addons/tools) reads as a marker of a
file that discovers or executes tools. evidence.go only reads tool
output, so reword the comment instead of classifying the file.

Docs-Not-Needed: comment-only change, no behaviour change
Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Stefan Walcz <stefan.walcz@walcz.de>
(cherry picked from commit 1043d3cbc4)
2026-11-03 19:18:35 +00:00
localai-org-maint-bot 041f2337df fix(chat): preserve complete tool source URLs
Keep balanced parentheses in source URLs and decode MCP text arrays before
extracting links. This preserves Wikipedia paths and escaped query
separators instead of appending truncated citations.

Assisted-by: Codex:gpt-6
Signed-off-by: Stefan Walcz <stefan.walcz@walcz.de>
(cherry picked from commit 9b81cb20ab)
2026-11-03 19:18:35 +00:00
Stefan Walcz 23012a7c4a feat(config): let a profile alias require a tool call on the first turn
A system prompt that tells a model to look things up first does not stop
it from answering from its own knowledge, for example when the question
comes with a picture.

profile.require_tool makes the first model call of a chat request that
offers the profile's server-side MCP tools use tool_choice "required".
Every follow-up call of the server-side tool loop is made with the
client's tool_choice again: a "required" that stayed in place would make
the model call a tool after every tool result and never answer until the
iteration limit.

With a tokenizer template the backend enforces "required" with a grammar
built from the chat template's tool-call format. Where LocalAI builds the
tool-call grammar itself, the first call's grammar leaves out the
no-action function instead.

The first call is not forced when no server-side tool was offered, when
the client set tool_choice or function_call itself, or when the request
does not end with a user message, so a request returning a client tool's
result cannot bounce tool calls between client and server.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Stefan Walcz <stefan.walcz@walcz.de>
(cherry picked from commit 2801938aac)
2026-11-03 19:18:35 +00:00
Stefan Walcz 864c176cd2 feat(config): append tool result URLs to uncited profile answers
A research profile asks the model in its system prompt to cite its
sources, but a model can answer from a search result without naming a
single link, and the client never sees the server-side tool results that
held them.

evidence_check.sources appends one line with the distinct http(s) URLs
returned by the request's successful MCP tool calls (at most five, in
order of appearance) when the final answer names no URL itself. An answer
that already links something is left unchanged, and nothing is added when
no tool result holds a URL, so a link is never made up. The label is
configurable through evidence_check.sources_label (default "Sources") for
profiles that answer in another language.

It runs in the existing evidence gate, on the same streaming and
non-streaming paths as the number note.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Stefan Walcz <stefan.walcz@walcz.de>
(cherry picked from commit 4ee6ff1395)
2026-11-03 19:18:35 +00:00
Ettore Di Giacinto 4bea5f7775 fix(ui): translate the new Home, Chats and Skills strings
Four recent changes added English strings without the other locales, so
the locale completeness gate failed in the UI unit tests. Add the keys
to the eight locales. The baseline stays as it is.

Assisted-by: Claude:claude-sonnet-5-5 node
2026-11-03 19:18:26 +00:00
Ettore Di Giacinto 94ea2cf54e test(p2p): check the errors returned by the pipe Close calls
Assisted-by: Claude:claude-sonnet-5-5 golangci-lint
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:18:06 +00:00
Ettore Di Giacinto d83365e05f test(p2p): drop the second Ginkgo bootstrap in the federated specs
The package already registers a suite in p2p_suite_test.go. A second
RunSpecs call made the whole package test binary fail with "RunSpecs
called more than once" even though every spec passed.

Assisted-by: Claude:claude-sonnet-5-5 go golangci-lint
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:18:06 +00:00
localai-org-maint-bot 4fdfba79b3 fix(p2p): balance active federated connections
Reserve capacity when selecting a worker and release it when forwarding
ends. Completed connections no longer bias routing toward new workers.
Keep active counts through offline periods and choose randomly on ties.

Add regression tests and document per-instance TCP connection counts.

Fixes #12992

Assisted-by: Codex:gpt-6
(cherry picked from commit 66cf106490)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:18:06 +00:00
Ettore Di Giacinto 23b2451983 test(e2e): bind connectors with a kind, caps and file transfers
The connector specs broke when bindings began to need a kind, to hold
no capability until the owner enables it, and to move file bytes by
handle only. The Telegram specs now name the kind. The Slack file spec
enables files.upload and pairs the sender, since a sender without a
role needs a pairing to send files. A test transport that can move
files gets the transfer table of the application, so its add-ons
declare the files ability as installed ones do.

Assisted-by: Claude:claude-sonnet-5-5 go ginkgo
2026-11-03 19:16:22 +00:00
Ettore Di Giacinto 6b181cd20b feat(studio): enforce the action policy of unattended runs
A trigger run or an agent job has nobody to approve a step, and so far
the approval mode auto_readonly and the act.* grants were only recorded.
The prompt was the only thing that kept such a run from acting.

Every tool call of an unattended run now goes through one check at the
call. A tool that only reads runs. Any other tool needs the grant of its
class, and the check fails closed:

- act.files for write_file, edit_file, move_file, delete_file and the
  built-in bash;
- act.addons, or act.addons:<id>, for add-on tools whose declared kind is
  not read, plus act.spend when the add-on gates the tool with a
  permission;
- act.spend for MCP tools.

A trigger holds its new acts list within the grants of its agent. A
trigger that declared read only runs, or that a binding in auto_readonly
mode made without asking, is refused every non-read tool whatever it
holds. A binding that cannot be read counts as auto_readonly. A job
holds the act grants of its agent. Sub-agents follow their parent, and a
saved agent cannot be started from an unattended run.

A refused call answers with a plain sentence the model can pass on, not
an error, and writes one audit log line. Triggers set acts through the
REST API; a model never can. A trigger whose plan names a file it writes
keeps act.files.

Assisted-by: Claude:claude-sonnet-5-5 go ginkgo swag
2026-11-03 19:12:29 +00:00
Ettore Di Giacinto 3cef8d5a91 feat(ui): show the builtin grants in the shared Tools list
The Tools list gains a group, "What the agent may change", with one
row per builtin grant: its title and a plain-words description, and a
mark on the sensitive ones. The agent form switches them through
useAgentTools; a chat of a saved agent lists the grants the agent
holds, read only. Both draw the group with the same useToolGroups and
SwitchPanel code.

The group has no group setter, so Select all and Disable all, and the
"N of M on" count, leave it alone: a bulk click must not grant a
right.

Assisted-by: Claude:claude-sonnet-5-5 node
2026-11-03 19:10:39 +00:00
Ettore Di Giacinto cf1041ca96 feat(ui): list agent skills on the Skills page
The Skills page asks for the skills of the saved agents with
agents=true and shows them with the agent's name. A skill of the
agent layer says who proposed it, can be removed (to the Trash) and
is not offered to other agents. The list of a plain chat or of the
agent form never carries them.

Assisted-by: Claude:claude-sonnet-5-5 go node
2026-11-03 19:10:39 +00:00
Ettore Di Giacinto dcd180ced8 feat(studio): add the agent skills layer
A saved agent keeps its own skills in LocalAI/agents/<agent>/skills.
Only a chat that runs that agent sees them. They sit between the folder
and personal layers, so an agent's version of a skill wins for that
agent, and they count as granted without being listed in the agent's
skills.

An agent writes one by a skill change proposal, as before; the new
layer only reads them. A proposal for an agent skill cannot take the
name of a core skill or of a document slot (read from slots.json).
When writing-skills loads in a chat of a saved agent it starts with
"Do not write files. Call propose_change with kind skill.", and the
skills.write grant makes it visible to the agent.

The Skills list gains the agent layer, with the agent's ID and name,
and a skill can be read or removed (to the Trash) with the agent
query parameter.

Assisted-by: Claude:claude-sonnet-5-5 go swag
2026-11-03 19:10:39 +00:00
dependabot[bot] 3d08883b38 chore(deps): bump the cargo group across 1 directory with 2 updates
Bumps the cargo group with 2 updates in the /backend/rust/kokoros directory: [openssl](https://github.com/rust-openssl/rust-openssl) and [rustls](https://github.com/rustls/rustls).

Updates `openssl` from 0.10.79 to 0.10.81
- [Release notes](https://github.com/rust-openssl/rust-openssl/releases)
- [Commits](https://github.com/rust-openssl/rust-openssl/compare/openssl-v0.10.79...openssl-v0.10.81)

Updates `rustls` from 0.23.37 to 0.23.45
- [Release notes](https://github.com/rustls/rustls/releases)
- [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rustls/rustls/compare/v/0.23.37...v/0.23.45)

---
updated-dependencies:
- dependency-name: openssl
  dependency-version: 0.10.81
  dependency-type: indirect
  dependency-group: cargo
- dependency-name: rustls
  dependency-version: 0.23.45
  dependency-type: indirect
  dependency-group: cargo
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 2f0535c488)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Assisted-by: Claude:claude-sonnet-5-5 gh git
2026-11-03 19:05:31 +00:00
dependabot[bot] c8e44a7e43 chore(deps): update transformers requirement
Updates the requirements on [transformers](https://github.com/huggingface/transformers) to permit the latest version.
- [Release notes](https://github.com/huggingface/transformers/releases)
- [Commits](https://github.com/huggingface/transformers/compare/v5.17.0...v5.18.0)

---
updated-dependencies:
- dependency-name: transformers
  dependency-version: 5.18.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 63ad641f2a)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Assisted-by: Claude:claude-sonnet-5-5 gh git
2026-11-03 19:05:31 +00:00
dependabot[bot] ef6a5c2eb4 chore(deps): bump grpcio from 1.84.0 to 1.85.0 in /backend/python/coqui
Bumps [grpcio](https://github.com/grpc/grpc) from 1.84.0 to 1.85.0.
- [Release notes](https://github.com/grpc/grpc/releases)
- [Commits](https://github.com/grpc/grpc/compare/v1.84.0...v1.85.0)

---
updated-dependencies:
- dependency-name: grpcio
  dependency-version: 1.85.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 8b52e30ffa)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Assisted-by: Claude:claude-sonnet-5-5 gh git
2026-11-03 19:05:31 +00:00
dependabot[bot] 6cda4ff24b chore(deps): bump securego/gosec from 2.29.0 to 2.30.0
Bumps [securego/gosec](https://github.com/securego/gosec) from 2.29.0 to 2.30.0.
- [Release notes](https://github.com/securego/gosec/releases)
- [Commits](https://github.com/securego/gosec/compare/v2.29.0...v2.30.0)

---
updated-dependencies:
- dependency-name: securego/gosec
  dependency-version: 2.30.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit d9a14f7e17)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Assisted-by: Claude:claude-sonnet-5-5 gh git
2026-11-03 19:05:31 +00:00
localai-org-maint-bot 2d1d46c1d7 feat(gallery): add Qwen 3D Coder preview
Add the pinned Q8 preview for llama.cpp and document installation.
Keep the HTDemucs source checksum aligned with the fix in #12919.

Assisted-by: Codex:gpt-6

(cherry picked from commit 66b4228310, mudler/LocalAI#12922)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:04:17 +00:00
localai-org-maint-bot b669cda329 feat(gallery): add Nanbeige4.3 GGUF variants
Add AD-Q4_K_M and Q8_0 builds with pinned URLs and verified checksums.
Group the builds and document installation with a 32K default context.

Assisted-by: Codex:gpt-6

(cherry picked from commit 1f41de1611, mudler/LocalAI#12926)
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-11-03 19:04:17 +00:00
Dorian Magasic 731cdbc6d6 fix(gallery): point Qwen3.5 Artemis file URIs at main
The nightly checksum job writes the LFS sha256 of main into each
entry, so a commit-pinned uri cannot follow it (see #12994). The files
on main are identical to the previously pinned revisions, so no sha256
changes.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Dorian Magasic <dorian.magasic@turintech.ai>
(cherry picked from commit 32ccb7dcc5)
2026-11-03 19:04:17 +00:00
Dorian Magasic 68927cd05b feat(gallery): add Qwen3.5 Artemis 2B, 4B and 9B variants
Add eight TurinTech Artemis GGUF builds of Qwen3.5 2B, 4B and 9B, each
with the repo's F16 vision projector, pinned by revision and SHA-256.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Dorian Magasic <dorian.magasic@turintech.ai>
(cherry picked from commit 622ac48d0f)
2026-11-03 19:04:17 +00:00
Dorian Magasic 68e2bbe4ca fix(gallery): point Gemma 4 Artemis file URIs at main
The nightly checksum job writes the LFS sha256 of main into each
entry, so a commit-pinned uri cannot follow it (see #12994). The files
on main are identical to the previously pinned revisions, so no sha256
changes.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Dorian Magasic <dorian.magasic@turintech.ai>
(cherry picked from commit 45a766b3bf)
2026-11-03 19:04:17 +00:00
Dorian Magasic 03fc04c3dd feat(gallery): add Gemma 4 Artemis E2B and E4B variants
Add seven TurinTech Artemis GGUF builds of Gemma 4 E2B and E4B, each
with the repo's F16 vision projector, pinned by revision and SHA-256.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Dorian Magasic <dorian.magasic@turintech.ai>
(cherry picked from commit 5e08aa4958)
2026-11-03 19:04:17 +00:00
Caldalis f88fa99e1d feat(gallery): add MiniCPM-OCR 1.0 models
Add OpenBMB's 1.3B Chinese/English document parser to the gallery as
three llama.cpp entries: the recommended Q8_0 build, a smaller Q4_K_M
build for constrained hosts, and an optional DSpark build that pairs the
Q8_0 target with the official speculative draft.

All entries install the required F16 4x vision projector, default to an
8,192-token single-slot context, and keep thinking disabled so
transcriptions land in the response content. Q8_0 is the declaring entry;
the other two are selectable variants.

Tested text, table, and mixed Chinese/English page OCR through LocalAI
on an RTX 4090; the DSpark build reached about 0.96 draft acceptance. The
model's projector type is new in llama.cpp, so the entries need a backend
built from the current master pin; the latest release backend predates it.

Assisted-by: claude code:opus5.5
Signed-off-by: Caldalis <zyk_computer@163.com>
(cherry picked from commit 91ff3f06cc)
2026-11-03 19:04:17 +00:00
mudler c82ae6e953 chore(model gallery): 🤖 add new models via gallery agent
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
(cherry picked from commit f2aa256d63)
2026-11-03 19:04:17 +00:00
Ettore Di Giacinto 0cd2efeb9f test(studiobot): guard the add-ons of the transport against a data race
EnableTransfers rewrote the add-ons and the gateway while the sync loop
of the connector manager already read them through Kinds, so the
race-detector run of the multi-frontend job failed. A read-write lock
now guards both. The runtime is copied out before a call, so the lock is
not held across it.

Assisted-by: Claude:claude-sonnet-5-5 go ginkgo
2026-11-03 19:03:12 +00:00
Ettore Di Giacinto 582642c964 feat(connector-ui): say what the add-on declares for each file direction
The Files section showed only the limit in effect. It now also says,
for receive and send, whether the add-on declares a largest file, no
limit, or no file support, shows the host ceiling, and gives help text
on each field. A direction the add-on does not support is disabled.

Assisted-by: Claude:claude-sonnet-5-5 node
2026-11-03 19:00:02 +00:00
Ettore Di Giacinto e55227b4e8 chore(addons): regenerate the library index for the GitHub description
The GitHub add-on description gained a clause about writing, but the
committed development index kept the old text, so catalog.sh --check
failed in CI. Regenerate it with catalog.sh.

Assisted-by: Claude:claude-sonnet-5-5 sh
2026-11-03 18:57:50 +00:00
Ettore Di Giacinto f97a96cc83 fix(chats): keep the draft commands state and let Hide work
The draft tools and add-on lists, and the tools list of a stored chat,
read the execution status without an execution scope. The host logged
an error and reported the status as not selected. They now run in a
scope; a draft has no conversation, so its status says "draft".

In the Home composer, switching a built-in tool group on or off reset
the commands state to the loading value and never read it again. The
composer then showed the unknown warning for good. The Hide button also
did nothing for that state, because it needed a binding identity that
the loading value does not have. A draft now keeps the state the list
gave it, and Hide works for any notice that is shown.

Assisted-by: Claude:claude-sonnet-5-5 go ginkgo node
2026-11-03 17:23:29 +00:00
Ettore Di Giacinto c007ccf994 fix(ui): re-check add-ons before showing the off notice on Home
The notice came from navigation state, which survives a refresh, so it
came back after add-ons were on again. A frontend also reports add-ons
as off when the owner does not answer for a moment, which looked the
same as the instance switch being off.

Home now reads /api/features on mount, drops the notice and clears the
history state when add-ons are on, and clears the state on dismiss.
/api/features gains addons_enabled (the instance switch alone), so the
notice can say "not answering right now" with a retry button when the
switch is on and the owner is silent.

Assisted-by: Claude:claude-sonnet-5-5 eslint node go-test
2026-11-03 17:19:38 +00:00
Ettore Di Giacinto f60e464fb3 test(studio): create connector bindings with a kind
A binding needs a kind now, so the route specs name the platform, and
the spec for an offline binding checks that nothing is kept while no
add-on serves the kind.

Assisted-by: Claude:claude-sonnet-5-5 go test
2026-11-03 17:05:24 +00:00