Skip to content

Tunnel Agent 0.8.0

Choose a tag to compare

@github-actions github-actions released this 19 Jun 14:41
· 58 commits to main since this release

Installation

Platform Installer Portable
Windows x64 Setup.exe .zip
Windows arm64 Setup.exe .zip
Linux x64 .AppImage
Linux arm64 .AppImage
macOS x64 (Intel) .pkg .zip
macOS arm64 (Apple Silicon) .pkg .zip

Existing installations update automatically via Velopack.


Added

  • Pi model reasoning flag (OpenRouterContextService, AgentConfigurationService): when configuring Pi, each model's reasoning support is now resolved from OpenRouter's public /v1/models endpoint (presence of the per-model reasoning object or "reasoning" in supported_parameters) and written as "reasoning": true per-model in models.json. The field is omitted for models without reasoning support, so it does not add redundant noise to the config. The manual preview resolves the same flag, so what you see matches what Apply writes.
  • Custom provider model selection (UpstreamModelFetchService, MainWindowViewModel, ConfigService, ProviderSettings, MainWindow.axaml): adding a custom OpenAI-compatible provider now probes {base-url}/models; on HTTP 200 a model-selection popup lists the upstream models (search + select-all, all unchecked, at least one required) and the chosen models are persisted under the provider's models: block in proxy-config.yaml. A non-200 or unreachable URL aborts the add and shows a top-right error toast without creating the provider.
  • Edit custom provider models (ProviderCatalogService, MainWindowViewModel, ProvidersView): custom provider rows now have an edit-models button that re-fetches {base-url}/models and reopens the selection popup with the currently exposed models pre-checked, so newly released or changed models can be added/removed without recreating the provider. The button shows a per-provider loading spinner and is disabled while the upstream fetch is in flight, so it no longer appears to hang on click.
  • Upstream API key providers (ProviderCatalogService, ConfigService, ProvidersView, MainWindow): added native API-key flows for Claude, OpenAI, and Gemini plus custom OpenAI-compatible providers stored in proxy-config.yaml, with add/edit dialogs, duplicate-key toast feedback, custom-provider add/remove actions, and localized UI strings.
  • Custom provider key deletion (ConfigService, ProviderCatalogService): deleting the last API key from a custom OpenAI-compatible provider now keeps the provider entry but removes the entire api-key-entries block, instead of deleting the provider or writing an empty api-key/label placeholder.
  • Custom provider API-key editing (ProviderCatalogService, MainWindowViewModel, ProviderViewModel, MainWindow.axaml.cs): editing an existing API key no longer shows the duplicate-key alert, label-only edits refresh the UI immediately, and clearing a label persists the empty label state back to proxy-config.yaml.
  • Quota account filtering (MainWindowViewModel, QuotaFetchService): API-key accounts are excluded from OAuth quota views and refresh loops so they no longer collide with OAuth token lookup or appear as quota-capable accounts.

Changed

  • Provider credentials source of truth (ConfigService, ProviderCatalogService): upstream provider API keys, labels, base URLs, disabled custom providers, and OpenAI-compatible provider entries now round-trip through proxy-config.yaml; legacy openai-compat-*.json files are migrated and removed.
  • Provider/account display (ProviderViewModel, ProvidersView): built-in providers now display as Claude, OpenAI, and Gemini; custom providers show their base URL on the provider row; API-key rows show the label with a masked xxxx...yyyy key underneath (or only the masked key when unlabeled); API-key credentials display as N API key(s), OAuth credentials as N connected account(s), and mixed providers as N connected account(s) / N API key(s); per-key enable toggles are hidden for API-key credentials that CLIProxyAPI cannot disable individually.
  • Gemini provider scope (ProviderCatalogService, ConfigService, OAuthService, QuotaView): Gemini support is now API-key-only via gemini-api-key; removed Gemini CLI OAuth/login, agent configuration, and quota UI paths after CLIProxyAPI dropped Gemini CLI support.
  • Unified alert/toast system (Themes/Brushes.axaml, Themes/Controls.axaml, Controls/ToastBehavior.cs, MainWindow, ConfigurationView, ProvidersView, MainWindowViewModel): replaced the previous ad-hoc, semi-transparent banners with a single cohesive alert system — info / warning / error tonalities on solid surfaces with severity-colored icons and titles, larger padding and type, and consistent light/dark brushes. Every transient toast (provider status, configuration status such as a duplicate listen port, management-key-repaired, engine/app “no update available”, and the bottom-center app/engine “update available” notices) now uses this styling, stacks in a window-pinned region so it stays visible regardless of page scroll, fades in/out via the reusable ctrl:Toast.IsOpen behavior (animating opacity and collapsing from layout once hidden), and auto-dismisses where appropriate. Toasts were moved out of the scrollable provider/configuration views into shared window-level overlays and dismiss commands, removing the old inline banners and floating cards.

Fixed

  • System default language switch (LocalizationService, MainWindowViewModel): switching from a manually-selected language back to System default now correctly follows the OS language. SetCulture mutates CultureInfo.CurrentUICulture, so resolving the system language from it returned the previously-selected override instead of the real OS culture. The OS UI culture is now captured once at process start (LocalizationService.SystemCulture) and used to resolve System default.
  • Provider row count localization (ProviderViewModel, Resources/Strings*.resx): the provider sub-line (N connected account(s), N API key(s), and the mixed … / … form) now resolves through localized resources and refreshes on language change instead of showing hardcoded English.
  • Built-in Gemini provider actions (ProviderViewModel, ProviderCatalogService): the edit-models and remove-provider buttons no longer appear on the built-in Gemini API-key provider — IsCustomProvider is now an explicit flag set only for user-added OpenAI-compatible providers instead of being inferred from API-key support.
  • Debug diagnostics startup (MainWindow.axaml.cs): debug builds now initialize Avalonia diagnostics conditionally so release deployments do not require the diagnostics assembly.