Developer Portal

  • Fixed

    • AI chat: always log network-level diagnostics (request URL, response status / headers, fetch errors, SSE stream lifecycle including premature termination) to the browser console so a “Network error” banner can be triaged from a user report without requiring the ai-chat-verbose-debugging feature flag. Verbose payload-level logging (messages, system prompt, tool schemas, per-event SSE detail) remains gated on the feature flag in non-production builds. See ./docs/releases/v0.129.1-changelog.md for more information.
  • Added

    • Make AI chat sampling parameters configurable per installation. The plugin previously called streamText() without temperature, topP, topK, seed, minP, or maxOutputTokens, so the server’s defaults applied – which for vLLM means temperature=1.0, top_p=1.0, top_k=-1, seed=null. That is far too loose for a tool-using agent backed by a reasoning model and was the dominant cause of token-cost variance in production agent loops (same prompt, fresh chat, observed total-token spread of 22k / 607k / 22k across three runs against the same Qwen3 endpoint). Config now accepts an aiChat.sampling block with temperature, topP, topK, minP, seed, and maxOutputTokens; all fields are optional and default behaviour with no sampling: block is unchanged. temperature, topP, topK, seed, and maxOutputTokens are forwarded through the AI SDK to every provider that supports them. minP is spliced into the request body via the OpenAI-compatible provider’s transformRequestBody hook, since vLLM accepts it as a top-level field but it is not part of the AI SDK call settings. The ai-chat-backend README documents recommended values per model family (Qwen3 thinking/non-thinking, Qwen3-Coder, GPT-4 / GPT-4o, Anthropic Claude). See ./docs/releases/v0.129.0-changelog.md for more information.
  • Fixed

    • Fix AI chat backend crash on every chat send. The tools field in the request body is optional, so it arrives as undefined whenever the frontend does not register any client-side tools. The previous implementation called Object.entries(tools) unconditionally, which threw TypeError: Cannot convert undefined or null to object, returning a 500 from POST /api/ai-chat/chat on every request. The browser surfaced this as “network error” and the LLM never reached the tool-merge step, so MCP-provided tools (muster, prometheus, kubernetes, …), skill tools, getDate, and the context-usage tool were also unreachable from chat. frontendTools now accepts null/undefined and treats them as an empty registry.
    • Rebuild MCP clients when the underlying transport closes. The AI chat backend caches one MCPClient per server for 30 minutes, but the cache was holding on to clients whose StreamableHTTP transport had already been torn down by muster (idle timeout, server reset, …). Tool calls then failed with MCPClientError: Attempted to send a request from a closed client until the TTL expired, surfacing in the browser as a “network error” banner. The cache now chains into the transport’s onclose callback and evicts the entry as soon as the connection drops, so the next request rebuilds the client cleanly. Tool execution also detects the same SDK error eagerly and marks the entry dead so a single failure – not a 30-minute window – triggers reconnection. See ./docs/releases/v0.128.1-changelog.md for more information.
  • Added

    • Add “Configure with AI” button to App Deployment template.

    Fixed

    • Render AI chat user messages as plain text with preserved whitespace so line breaks (shift+enter) display consistently instead of being collapsed by markdown rendering. See ./docs/releases/v0.128.0-changelog.md for more information.
  • Added

    • Allow customization of theme colors via app.branding.theme configuration.
    • Make AI-chat skills configurable per deployment via aiChat.skills (opt out of bundled skills with bundled: false, load extra skills from a directory with dir, or define them inline with inline).

    Fixed

    • Make the sqlite-persistence CI test case (ci-values-case3-sqlite-persistent.yaml) inject a real backend.database.connection.directory override and update the surrounding comment so it reflects what current Backstage actually accepts. The previous comment suggested connection: /var/lib/backstage/db.sqlite, which the Sqlite3Connector rejects at runtime with "connection.filename" is not supported for the base sqlite connection. See ./docs/releases/v0.127.0-changelog.md for more information.
  • Added

    • Added configuration options to allow for persisting the SQLite database.
    • Add Mermaid diagram support to AI chat markdown rendering.
    • Render <details>/<summary> HTML in AI chat markdown.
    • Allow AI chat MCP servers to act as the logged-in Backstage user via the new useBackstageUserToken option, so user-context tools like auth.who-am-i work without a static external-access token.

    Changed

    • Strip reasoning content from past AI chat assistant messages to reclaim context tokens for Claude conversations.
    • Replace the fa-kubernetes Font Awesome icon with an inline SVG and remove the Font Awesome kit integration.
    • Replace @terasky/backstage-plugin-catalog-mcp-backend with the built-in catalog.query-catalog-entities action from @backstage/plugin-mcp-actions-backend.

    Fixed

    • Fix AI chat input freezing after typing dead keys (e.g., backtick on German keyboard).

    Removed

    • Remove the custom getCurrentUserInfo AI chat agent tool, superseded by the upstream auth.who-am-i tool from the mcp-actions MCP server. See ./docs/releases/v0.126.0-changelog.md for more information.
  • Added

    • Persist AI chat conversations and add a conversation history page with rename, delete, batch delete, and pagination, plus a history view in the chat drawer.
    • Add a getDate tool to the AI chat agent for retrieving the current date and time.
    • Prune older tool outputs in AI chat once cumulative tool I/O exceeds a configurable budget (aiChat.pruning.reservedTokens, aiChat.pruning.minimumSavingsTokens).

    Changed

    • Report AI chat context size, output tokens, and cost by requesting token usage from OpenAI-compatible streaming responses (vLLM/KServe).
    • Clarify tool use in the muster system prompt to avoid calling internal tools via muster’s call_tool.

    Fixed

    • Re-observe the element when the ref target changes in useContainerDimensions.
    • Reject empty titles in PATCH /conversations/:id/title with HTTP 400. See ./docs/releases/v0.125.0-changelog.md for more information.
  • Added

    • Make sidebar logo image height configurable via app.branding.logo.height.

    Fixed

  • Added

    • Allow overriding the AI chat context window size via aiChat.contextWindow in app-config.

    Changed

    • Improve markdown table rendering in AI chat: tables are now horizontally scrollable with better cell spacing.

    Fixed

    • Cache-bust custom branding logo URLs so replaced logos appear immediately instead of being served stale from the browser cache. See ./docs/releases/v0.124.3-changelog.md for more information.
  • Changed

    • Decouple custom branding from the gs-backend plugin so branding assets are served by a dedicated backend plugin and work without gs: config. See ./docs/releases/v0.124.2-changelog.md for more information.