Expose a dedicated container metrics endpoint and surface current CPU, memory, and root filesystem usage in the bot container view. This gives operators a quick health snapshot while degrading cleanly on unsupported backends.
Expose a paginated endpoint and UI table that lists individual LLM call
records (assistant messages with usage) per bot, showing time, session
type, model, provider, and token counts. Respects existing date / model
/ session-type filters and adds full-height loaders plus a max-width
layout to keep the usage page consistent with other top-level pages.
- VitePress zh: getting-started, install, memory/TTS providers, full channel set; update zh sidebar
- Drop zh-only pages with no English counterpart
- Add humanizer and humanizer-zh skills; update skills-lock.json
Introduce a new `show_tool_calls_in_im` bot setting plus a full overhaul of
how tool calls are surfaced in IM channels:
- Add per-bot setting + migration (0072) and expose through settings API /
handlers / frontend SDK.
- Introduce a `toolCallDroppingStream` wrapper that filters tool_call_* events
when the setting is off, keeping the rest of the stream intact.
- Add a shared `ToolCallPresentation` model (Header / Body blocks / Footer)
with plain and Markdown renderers, and a per-tool formatter registry that
produces rich output (e.g. `web_search` link lists, `list` directory
previews, `exec` stdout/stderr tails) instead of raw JSON dumps.
- High-capability adapters (Telegram, Feishu, Matrix, Slack, Discord) now
flush pre-text and then send ONE tool-call message per call, editing it
in-place from `running` to `completed` / `failed`; mapping from callID to
platform message ID is tracked per stream, with a fallback to a new
message if the edit fails. Low-capability adapters (WeCom, QQ, DingTalk)
keep posting a single final message, but now benefit from the same rich
per-tool formatting.
- Suppress the early duplicate `EventToolCallStart` (from
`sdk.ToolInputStartPart`) so that the SDK's final `StreamToolCallPart`
remains the single source of truth for tool call start, preventing
duplicated "running" bubbles in IM.
- Stop auto-populating `InputSummary` / `ResultSummary` after a per-tool
formatter runs, which previously leaked the raw JSON result as a
fallback footer underneath the formatted body.
Add regression tests for the formatters, the Markdown renderer, the
edit-in-place flow on Telegram/Matrix, and the JSON-leak guard on `list`.
Introduce a shared SettingsShell with narrow/standard/wide/full width
tiers, and convert the primary provider/memory/speech/transcription/
email/browser/bot-mcp/channel/heartbeat/compaction settings forms from
single-column space-y stacks to md:grid-cols-2 grids where short fields
pair up and long inputs (secrets, URLs, webhooks, commands, etc.) stay
full width.
Also fix the provider model list, platform grid, and bots grid to use
responsive breakpoint columns instead of single-column flex or fixed
grid-cols-4 / minmax(400px), and make model/bot cards equal-height with
bottom-aligned actions.
The discuss driver's RC+TR composition had three compounding bugs that
caused old tasks to be re-answered after idle timeouts and made the LLM
blind to its own prior tool usage:
- DecodeTurnResponseEntry only kept visible text via TextContent(), so
assistant steps carrying only tool_call parts (the first half of every
tool round) were dropped entirely. Rewritten to render tool_call and
tool_result parts as <tool_call>/<tool_result> tags, covering both
Vercel-style content parts and legacy OpenAI ToolCalls/role=tool
envelopes. Reasoning parts remain stripped to avoid re-injection.
- loadTurnResponses hard-capped TRs at 24h while RC is replayed in full
from the events table, producing asymmetric context (user messages
from day 1 visible, matching bot replies missing). The cap is removed;
any size-bound trimming belongs in compaction, not here.
- lastProcessedMs lived only in memory and was set to time.Now() at turn
end. After the 10-minute idle timeout, the goroutine exited and the
next turn started with cursor=0, treating the entire history as new
traffic. Now initialised from the latest TR's requested_at on cold
start, and advanced to max(consumed RC.ReceivedAtMs) per turn so that
messages arriving mid-generation trigger a follow-up round instead of
being wrongly marked processed.
Replace the read-only schedule list with a form-driven builder so users
never hand-edit cron patterns. A canonical ScheduleFormState feeds two
inverse pure functions (toCron / fromCron) that guarantee round-trip
equivalence, so new and edit flows share the exact same UI state shape
even though the DB stores only the pattern. Unrecognised patterns (AI-
generated ranges/steps, descriptors, 6-field seconds cron) fall back
losslessly to an advanced mode instead of being silently rewritten.
The dialog adds live previews (human-readable via cronstrue, next 3
trigger times via cron-parser evaluated in the bot timezone) and row
actions for edit / enable-toggle / delete.
Prevent the About page from rendering duplicate `v` prefixes when the server already returns tags like `v0.7.0`. Reuse the same normalization for release checks so the displayed version and update comparison stay consistent.
Avoid feeding structured tool payloads back into pipeline context as doubly encoded JSON, and return readable history summaries instead of raw message blobs.
* feat: expand speech provider support with new client types and configuration schema
* feat: add icon support for speech providers and update related configurations
* feat: add SVG support for Deepgram and Elevenlabs with Vue components
* feat: except *-speech client type in llm provider
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: remove go.mod replace
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: update go module dependencies
* feat: Ear and Mouth
* fix: separate ear/mouth page
* fix: separate audio domain and restore transcription templates
Move speech and transcription internals into the audio domain, restore template-driven transcription providers, and regenerate Swagger/SDK so the frontend can stop hand-calling /transcription-* APIs.
---------
Co-authored-by: aki <arisu@ieee.org>
* feat: expand speech provider support with new client types and configuration schema
* feat: add icon support for speech providers and update related configurations
* feat: add SVG support for Deepgram and Elevenlabs with Vue components
* feat: except *-speech client type in llm provider
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: remove go.mod replace
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: update go module dependencies
* feat: Ear and Mouth
* fix: separate ear/mouth page
* fix: separate audio domain and restore transcription templates
Move speech and transcription internals into the audio domain, restore template-driven transcription providers, and regenerate Swagger/SDK so the frontend can stop hand-calling /transcription-* APIs.
---------
Co-authored-by: aki <arisu@ieee.org>
* feat: expand speech provider support with new client types and configuration schema
* feat: add icon support for speech providers and update related configurations
* feat: add SVG support for Deepgram and Elevenlabs with Vue components
* feat: except *-speech client type in llm provider
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: remove go.mod replace
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: update go module dependencies
---------
Co-authored-by: Acbox <acbox0328@gmail.com>
Give bots their known per-channel account handles in the system prompt so they can reason about platform-specific self references consistently. Reuse persisted channel self_identity data across chat, discuss, schedule, heartbeat, and subagent prompts.
Emit tool-call placeholders as soon as tool input streaming starts so long writes appear immediately in chat. Reuse the same UI tool message when full input arrives to avoid duplicate cards, and keep the hook-required test suite green.
- Add POST /bots/:bot_id/sessions/:session_id/compact endpoint for
synchronous context compaction with fallback to chat model when no
dedicated compaction model is configured
- Add "Compact Now" button to session info panel in the web UI
- Add /compact slash command for triggering compaction from chat
- Regenerate OpenAPI spec and TypeScript SDK
SQL queries (CountProviders, CountModels, ListModels, ListEnabledModels,
ListModelsByProviderID) now exclude speech types. Added IsLLMClientType
guard to prevent cross-domain queries via /models?client_type and
/providers/:id/import-models. Frontend provider forms no longer offer
edge-speech as a client type option.
Also fixed pre-existing SA5011 staticcheck warnings in proxy_test.go
and executor_test.go.
The per-bot context_token_budget column was unused (no frontend UI) and
has been removed. Context trimming now derives the budget from the chat
model's context_window setting, which is already configured per model.