open-webui/backend/open_webui/utils
Claude e6eb4c86bb
fix: prevent terminal server spec cache poisoning after restart
A spec fetch that failed while the terminals orchestrator was still cold
(e.g. right after a stack restart, while it removes conflicting stopped
containers and re-provisions) used to overwrite the cached terminal server
list in app state and Redis with an empty list. Since nothing on the
message path ever refreshed that cache, every chat request then failed
with "Terminal server '<id>' is unavailable" until an admin re-saved the
connection settings.

- set_terminal_servers: keep the last known good cached entry (same id
  and URL) for any enabled connection whose spec fetch failed, instead of
  caching its absence; wrap the Redis write in try/except so a Redis blip
  doesn't fail the request.
- get_terminal_tools: rebuild the cache once when the requested terminal
  id is missing before raising "unavailable", so a stale or cold cache
  self-heals on the next message.
- main.py: warm terminal server specs at startup whenever terminal
  connections exist; this was previously gated on classic tool server
  connections being configured.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N972k9EbZ4vR3JZfHSNqmK
2026-08-27 19:17:45 +00:00
..
access_control fix: keep folder parent references acyclic (#28748) 2026-08-24 17:06:19 -04:00
images perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00
mcp refac 2026-06-29 11:56:00 -05:00
telemetry refac(telemetry): drop deprecated semconv SpanAttributes subclass (#25784) 2026-06-29 02:05:34 -05:00
actions.py fix: enforce action availability and model access on the chat action route (#27243) 2026-07-23 12:23:05 -04:00
anthropic.py fix: use the pooled client timeout for the Anthropic Messages passthrough (#27675) 2026-08-24 07:33:33 -04:00
asgi_middleware.py refac 2026-08-24 18:29:36 -04:00
ask_user.py refac 2026-08-13 21:02:17 -06:00
audit.py perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00
auth.py fix: revoke existing sessions when a password changes (#28725) 2026-08-17 13:56:29 -07:00
automations.py refac 2026-08-25 16:04:43 -04:00
calendar.py refac 2026-07-31 17:30:47 -04:00
channels.py refac 2026-03-17 17:58:01 -05:00
chat.py perf: build info log messages lazily so raising the log level actually saves work (#27837) 2026-08-02 15:39:10 -05:00
chat_fork.py refac 2026-07-23 02:54:56 -04:00
chat_id.py refac 2026-07-26 21:12:14 -04:00
chat_variables.py refac 2026-07-31 17:41:14 -04:00
code_interpreter.py refac 2026-07-31 17:41:14 -04:00
context_compaction.py refac 2026-08-23 13:36:53 -04:00
embeddings.py refac: modernize type annotations (PEP 604 / PEP 585) 2026-05-12 17:10:15 +09:00
files.py refac 2026-07-23 21:29:33 -04:00
filter.py refac 2026-08-25 15:00:53 -04:00
groups.py refac: modernize type annotations (PEP 604 / PEP 585) 2026-05-12 17:10:15 +09:00
headers.py refac 2026-08-24 18:38:29 -04:00
json_codec.py perf: write task payloads to Redis as bytes (#28833) 2026-08-20 12:58:52 -07:00
json_response.py perf: optional orjson JSON codec behind ENABLE_ORJSON (#27583) 2026-07-27 03:45:37 -04:00
logger.py perf: stop formatting every exported log record twice under OTEL log export (#27840) 2026-08-10 23:13:52 -06:00
memory.py refac 2026-08-10 19:28:21 -06:00
middleware.py chore: format 2026-08-25 16:53:53 -04:00
misc.py chore: format 2026-08-25 16:53:53 -04:00
model_ids.py refac 2026-07-26 23:09:22 -04:00
models.py refac 2026-08-13 00:07:31 -06:00
notifications.py refac 2026-07-27 19:39:36 -04:00
oauth.py chore: format 2026-08-25 16:53:53 -04:00
payload.py refac 2026-08-16 22:56:19 -07:00
pdf_generator.py refac: modernize type annotations (PEP 604 / PEP 585) 2026-05-12 17:10:15 +09:00
plugin.py perf: build info log messages lazily so raising the log level actually saves work (#27837) 2026-08-02 15:39:10 -05:00
rate_limit.py refac: modernize type annotations (PEP 604 / PEP 585) 2026-05-12 17:10:15 +09:00
redis.py fix: Set default Redis socket timeout to None (#27104) 2026-07-27 00:30:00 -04:00
response.py refac 2026-08-17 00:57:57 -07:00
sanitize.py refac 2026-03-17 17:58:01 -05:00
security_headers.py refac 2026-08-24 18:29:36 -04:00
session_pool.py fix: long streamed lines no longer abort the response (#28114) 2026-08-25 12:16:37 -04:00
subagents.py chore: format 2026-08-25 16:53:53 -04:00
task.py refac 2026-06-19 00:16:06 +02:00
terminals.py refac 2026-08-19 22:48:32 -07:00
timers.py fix: index the chat queries that make large SQLite instances unusable (#27663) 2026-08-23 16:11:54 -05:00
tool_approval.py chore: format 2026-08-25 16:53:53 -04:00
tools.py fix: prevent terminal server spec cache poisoning after restart 2026-08-27 19:17:45 +00:00
validate.py refac 2026-07-27 19:39:36 -04:00
valves.py refac 2026-07-31 17:41:14 -04:00
webhook.py perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00