Tunnel Agent 0.8.0
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/modelsendpoint (presence of the per-modelreasoningobject or"reasoning"insupported_parameters) and written as"reasoning": trueper-model inmodels.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'smodels:block inproxy-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}/modelsand 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 inproxy-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 entireapi-key-entriesblock, instead of deleting the provider or writing an emptyapi-key/labelplaceholder. - 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 toproxy-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 throughproxy-config.yaml; legacyopenai-compat-*.jsonfiles 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 maskedxxxx...yyyykey underneath (or only the masked key when unlabeled); API-key credentials display asN API key(s), OAuth credentials asN connected account(s), and mixed providers asN 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 viagemini-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 reusablectrl:Toast.IsOpenbehavior (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.SetCulturemutatesCultureInfo.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 —IsCustomProvideris 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.