跳到正文

Kaeso 0.2.0。发布于 2026年10月18日,包含 46 项变更。

发布日期
变更
46 项变更
本版本内容
新增、变更、移除、修复和安全
GitHub 上的版本(在新标签页中打开)

Kaeso 0.2.0 lets self-hosted installs learn about new releases and, with the optional updater, apply them in one click. It also adds installs that sign in with single sign-on alone, CORS for browser apps, and model availability in the project catalogue. Requests that a provider or model would refuse, such as Anthropic Messages requests without max_tokens, are now refused before they are sent, so check any app that relied on Kaeso filling in the limit. The gateway no longer logs the setup link, the console no longer shows an API key's secret a second time, and the documentation is rewritten, with diagrams, code tabs and a changelog page.

  • Breaking: Anthropic Messages requests without max_tokens are now refused with 400, as Anthropic refuses them. Forced tool choice for Claude Fable 5.1, Opus 5.5 and Sonnet 5.5, and OpenAI Responses output limits below 16, are also refused before sending. Apps that relied on Kaeso filling in the output limit must send max_tokens themselves. (#34(在新标签页中打开))

Contributors: @dvnold

Full changes: v0.1.0...v0.2.0(在新标签页中打开)

新增

Gateway

  • Web apps can call the model API from a browser: KAESO_CORS_ALLOWED_ORIGINS lists their origins, which then get CORS headers on /v1, preflights answered without a key, and readable kaeso-* and retry-after headers. Nothing changes while it is empty, the default, and * is refused. (#33(在新标签页中打开))

UI library

  • ThemeSelect, a select for the system, light or dark theme, with its label and choices in the provider's language, beside ThemeMenu. The documentation site's sidebar now shows the same language and theme selects as the showcase. Every ThemeProvider on a page follows the same theme choice, so a ThemeMenu or ThemeSelect in one island changes the others too. (#25(在新标签页中打开))
  • icons.update in the UI library's icon vocabulary.

Documentation

  • A changelog page on the documentation site, after the introduction, made from CHANGELOG.md in English, German and Simplified Chinese. It shows every release with its date in the page's language, an address such as /changelog#v0.1.0, Latest and pre-release marks, and links to its GitHub release and to the changes since the release before. The showcase's changelog shows the same releases, marks and links, with its section names in the page's language, and shows unreleased changes only when there are any. (#29(在新标签页中打开))
  • Both sites list every page in every language in sitemap.xml, with hreflang alternates and x-default, and name the sitemap in robots.txt. Every page has a canonical address and Open Graph and Twitter tags with a preview image. Not-found pages and the showcase's examples and states pages stay out of search results. On phones, both sites open search from a button in the header, for which AppFrame takes phoneActions. The showcase's View source links, llms.txt and changelog links open the release's tag instead of dev, and its German and Chinese page descriptions and its German search placeholder are fixed. (#28(在新标签页中打开))
  • Diagrams in the documentation are mermaid code blocks drawn at build time into a light and a dark SVG in Kaeso's colours and type. They follow the theme, are named for screen readers by accTitle and accDescr, and are searchable by their labels; no Mermaid code reaches the browser. A diagram that doesn't parse, or a code block that draws with box-drawing characters, fails the build with its file and line. The UI library adds ThemeImage, which follows the theme and prints the light version, and Code flow="text", so long inline code breaks with its sentence. A nested folder's page is named by its title in the sidebar. (#54(在新标签页中打开))
  • Code examples in the documentation show as language tabs, such as curl, Python and TypeScript, and the reader's choice carries to every group on the page and on the next page. Next steps show as link cards, and every heading links to itself. In @logicplanes/kaeso-ui, CodeBlock takes tab and onTabChange, and Link gains the heading and card variants. (#91(在新标签页中打开))
  • A new guide, Automate with the Platform API, walks from creating a project, adding a provider key and a model, and creating an app's key with a service account, to calling the model and reading usage and logs. It takes every key from the environment. (#99(在新标签页中打开))
  • Ideas and questions have a home in GitHub Discussions: the issue chooser links to it, an Ideas discussion asks for the idea in a sentence or two, and the contributing page explains the categories and how an agreed idea becomes a feature request. (#31(在新标签页中打开))
  • Documentation pages show the current version wherever they write {{version}}, replaced at build time from the repository's version in text, code and frontmatter, so a release never needs a page edited. A backslash before it keeps it literal.

Self-hosting

  • Updates for self-hosted installs: the gateway checks GitHub for new releases twice a day and shows the running and newest versions, with release notes, under Settings › Instance › Updates. KAESO_UPDATES_CHECK=false turns the check off. The optional updater (COMPOSE_PROFILES=updater, KAESO_UPDATER_TOKEN) applies a release in one click: it verifies the signed build provenance, pulls images by digest, waits for migrations, and rolls back when the new version doesn't start and the database wasn't migrated. Major releases and releases with manual steps update by hand, and every update is audited. Caddy serves an updating page in three languages meanwhile, and each release carries an attested release.json and the kaeso-updater image. (#40(在新标签页中打开))

变更

  • The README shows a short recording of the console, in a light and a dark version, instead of a screenshot: connecting a provider key, creating an API key, sending a request and watching it arrive in the request logs. pnpm demo records it again on the seeded development stack.

Gateway

  • The project catalogue knows whether each model's provider serves it to the project's provider key. Check availability on the Models page (POST …/models/check) asks the provider, requests teach it too, and a model marked Unavailable is left out of GET /v1/models. Changing a provider key resets its models to Not checked. Models that models.dev marks deprecated show Deprecated and have lifecycle: "deprecated" in Anthropic listings. A request for a model the provider doesn't serve fails with 404 and param: model in the app's format, with a message that names the provider and the model. Kaeso confirms this with the provider's model endpoint first and never retries. (#37(在新标签页中打开))

Console

  • Smaller console downloads: a project's overview loads 25 kB less JavaScript and the sign-in page 4 kB less, the documentation site's frame 3.6 kB less, and a page's code is requested while the console starts instead of after its first render. AppFrame loads its phone navigation sheet once the page is idle or on the first tap, and the charts no longer need d3-scale's colour and number-format modules. (#35(在新标签页中打开))

Documentation

移除

Documentation

修复

Gateway

  • Requests are refused before sending wherever the API or the model would refuse them. Anthropic Messages requests without max_tokens get Anthropic's 400 invalid_request_error instead of the model's output limit, while the OpenAI formats still get it; OpenAI Responses requests with max_output_tokens below 16 are refused, also from other formats; Claude Fable 5.1, Opus 5.5 and Sonnet 5.5 requests with a forced tool choice are refused, with a new catalogue field, Accepts a forced tool choice, to change it per model; and adaptive thinking for a Claude model without it is refused. Anthropic-format error bodies carry the request's id in request_id, and capability refusals name the app's own field. (#34(在新标签页中打开))
  • Rights changes no longer leave a right without one it needs. A change to a member's, service account's or role's rights is refused with 400 when it removes a needed right, also when that right already lacked another of its needs. A custom role change that would leave any member, project member or service account who holds the role with a right but without its need is refused with 400, in the console too. The message names the right, its need and how many holders it affects, and nobody's rights change. (#41(在新标签页中打开), #42(在新标签页中打开))
  • A single sign-on refused by the identity provider, such as with access_denied, ends its sign-in flow and returns to the sign-in page with next. When the sign-in began from an organization's sign-in link, it also keeps org, so that organization's button shows again. Requests refused before they reach a model in another format name the field the app sent, such as max_completion_tokens or max_tokens rather than max_output_tokens. The bundled Caddy has a health check, so docker compose up -d --wait returns only once Caddy serves too. (#44(在新标签页中打开))
  • Model availability is recorded more reliably. The request log keeps the provider's own 404 message, while the app still gets Kaeso's explanation. A check or request under way while an org admin replaced, assigned, made default or deleted a provider key no longer records the old key's answer over the reset; the check reports such models as key_changed. A provider that answers 404 to GET /v1/models/{model}, such as an OpenAI-compatible service without that endpoint, no longer makes every model Unavailable. Kaeso marks a model unavailable only when the provider's listing answers and lacks it; otherwise it passes the 404 through and reports the check as inconclusive. (#46(在新标签页中打开))

Console

  • The console's audit logs show the actor's profile picture, in the Actor column and in the actor filter, instead of only an initial, and a project's API keys show their owner's picture. (#30(在新标签页中打开))
  • Everything typed after ⌘K or Ctrl+K reaches the search of the documentation site and the console's command palette, also while its code is still loading and in the moment before its field has focus. CommandPalette takes query to show a query its host keeps. (#61(在新标签页中打开))
  • Turning two-factor authentication on or off, or changing your password, no longer signs you out when the console was loading something at the same moment.

UI library

  • Collapsible, Accordion and the sidebar no longer shift their content while they open or close, so a press during the animation is no longer lost. (#22(在新标签页中打开))
  • The component registry in @logicplanes/kaeso-ui lists every component's default variants again, without an extra _DEFAULT entry per component. (#27(在新标签页中打开))
  • Dialogs whose content changes, such as a StepDialog's steps or a LayerDialog's layers, stay centered and resize smoothly instead of jumping. StepDialog takes result to show what the last step made in the same dialog, so creating a key or a platform key, or setting up two-factor authentication, no longer opens a second dialog. A dialog stays open while its work is underway: Dialog and LayerDialog take busy, and StepDialog and AlertDialog are busy while they submit. Closing Create key while the key is being created no longer loses its one-time secret, and no console action can be sent twice. (#38(在新标签页中打开))
  • The parts of @logicplanes/kaeso-ui that load their code on demand recover from a failed download instead of staying broken until a reload. This covers AppFrame's phone navigation and the collapsed sidebar's peek, the sidebar's menus, tooltips, date pickers, and a list's checkboxes and later rows. The next tap, hover, focus or scroll loads the code again, from a fresh address in Chromium and WebKit; nothing retries on its own. While AppFrame's sheet is still on its way, Escape, a tap outside or the toggle takes the tap back, and a pointer that leaves the button cancels the peek. (#45(在新标签页中打开))
  • ScrollArea, and with it the tables in the documentation, scrolls only in its own direction and only when its content overflows, so a table that fits no longer bounces or holds back the page's scroll. Inline Code in the documentation flows with the text around it and has 4px of padding inside the chip, so a comma or closing bracket after it stays beside it. Code takes flow="cell" for long code in a table cell. (#58(在新标签页中打开))
  • On touch screens, code blocks keep their first line clear of the copy button, so the end of a one-line command is no longer hidden on a phone. (#78(在新标签页中打开))
  • A step dialog that moves on while a select is still closing no longer causes ResizeObserver loop errors. Every resize observer in the library now applies its changes together on the next frame. (#82(在新标签页中打开))

Documentation

  • Tables in the documentation keep their words whole and scroll inside a named region when they are wider than the screen, and the previous and next links show their label above the page title. A ScrollArea with an aria-label is now a region that screen readers announce. (#24(在新标签页中打开))
  • The introduction's diagram runs top to bottom, so it fits a phone in every language. (#80(在新标签页中打开))
  • Statements that no longer matched the gateway and the codecs are corrected. Among them are which instance and update settings need a recent sign-in, what effort none does on Claude, and which OpenAI error bodies reach which apps. (#136(在新标签页中打开))

Self-hosting

  • The console image sets the permissions of its files itself, so an image built with a strict umask serves the console instead of restarting silently, and it names any file it can't read. Each release pulls both images for both platforms without signing in and fails with what to do when a package is private, and the guides use docker compose up -d --wait and show a proxy in Docker on a network of its own. Both sites ship their Content Security Policy in a <meta> and in csp.txt and _headers, with the documentation under script-src 'self'; style-src 'self', now that ScrollArea and Select no longer add an inline <style> element. (#36(在新标签页中打开))

安全

Gateway

  • The gateway no longer logs the setup link, which anyone reading its logs could have used to take over an install before its first user existed; it says to run kaeso setup-link instead. Installs can sign in with single sign-on alone: the sign-in page offers the identity provider's button when it is the only one or comes from an organization's sign-in link (/sign-in?org=…), and can start at the provider without a click. GET /platform/v1/auth/oidc/start links straight to the provider. Setup with passwords off asks for none, and kaeso user sign-in-link <email> prints an audited one-time link. Single sign-on returns to the page in next, which must be a console path, and the cross-site refusal names the Origin header to send. (#39(在新标签页中打开))

Console

  • The console no longer shows an API key's secret again after its dialog was closed; until a reload, the next Create key opened on the last key's secret. The secret now leaves the page and the console's memory once the dialog has closed. Every console dialog opens fresh, including transfer ownership, add owner, send test email, change email, change password, export requests and add models, through DialogScope in @logicplanes/kaeso-ui, which mounts its content anew on each open. The command palette keeps its results while it closes, and the documentation search opens with an empty query. (#32(在新标签页中打开))

更多版本