Skip to content

feat: add Anaconda Desktop provider - #11714

Merged
lambertjosh merged 4 commits into
mainfrom
married-lathe
Jun 26, 2026
Merged

feat: add Anaconda Desktop provider#11714
lambertjosh merged 4 commits into
mainfrom
married-lathe

Conversation

@lambertjosh

@lambertjosh lambertjosh commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

What changed

Add Anaconda Desktop as a local model provider in the CLI and VS Code. Kilo discovers the installed Desktop application and its active text-generation server, stores only the inference connection needed at runtime, and exposes dedicated connect and refresh flows with explicit guidance when tool calling is unavailable.

Why

Anaconda Desktop users can already run OpenAI-compatible local model servers, but connecting them to Kilo required manually copying endpoint and credential details. This integration keeps Desktop as the owner of model and server lifecycle while making the Kilo connection discoverable and repeatable.

Provider registration

Anaconda Desktop uses a small catalog seed plus a provider.models plugin hook. Model hooks run only for providers already present in the initial models.dev catalog; unlike OpenAI Codex, GitHub Copilot, and DigitalOcean, Anaconda Desktop has no models.dev entry to modify. The seed makes it visible as a disconnected provider, and the plugin replaces its setup placeholder with models discovered from the stored Desktop connection.

The custom OpenAI/Atomic Chat config-provider path is intentionally not used. That path represents user-owned configuration and only exists after opt-in/configuration, while Anaconda must be discoverable before connection and its endpoint, key, model, context, and capabilities are generated by Desktop. Persisting those values as custom provider configuration would introduce generated-config ownership, stale-model, and disconnect-cleanup concerns.

A future generic plugin API could allow plugins to declare catalog metadata for providers absent from models.dev, eliminating the seed overlays. That broader provider-framework change is kept out of this feature PR.

Design constraints

  • Discovery is read-only and accepts loopback inference endpoints only.
  • Desktop management and inference credentials remain separate and are never returned to clients.
  • Setup performs one initial check and explicit manual refreshes rather than background polling.
  • Runtime support uses the existing legacy provider stack and OpenAI-compatible transport.
  • Kilo-specific behavior lives under owned paths; shared OpenCode files contain only narrow registration hooks.

.toLowerCase()
if (/embed|rerank|sentence[-_ ]similarity/.test(kind)) return false
const capabilities = record(props.capabilities) ? props.capabilities : undefined
if (capabilities?.chat === false || capabilities?.completion === false) return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Chat-only servers are rejected as unhealthy

This treats capabilities.completion === false as a hard failure, but this provider later goes through the OpenAI-compatible chat runtime rather than the legacy completions API. A server that explicitly disables text completions while still supporting chat will therefore be misclassified as inference-unhealthy and can never be connected. It would be safer to reject only when Desktop reports chat support is unavailable.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

} satisfies DiscoveryResult
}

const server = servers[0]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Discovery stops after the first running server

/api/servers?status=running&tag=inference can return more than one running server, but this code always validates servers[0] and returns inference-unhealthy as soon as that one fails. If the first entry is stale or unhealthy while a later entry is healthy, setup is blocked even though Desktop already has a usable local server. Scanning the list until one server passes discovery would avoid that false negative.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@kilo-code-bot

kilo-code-bot Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (9 files)
  • packages/kilo-vscode/src/anaconda-desktop/bridge.ts
  • packages/kilo-vscode/src/shared/anaconda-desktop-messages.ts
  • packages/kilo-vscode/tests/unit/message-contract.test.ts
  • packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts
  • packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts
  • packages/kilo-vscode/webview-ui/src/utils/anaconda-desktop-action.ts
  • packages/opencode/src/kilocode/anaconda-desktop/platform.ts
  • packages/opencode/test/kilocode/anaconda-desktop/httpapi-exercise-scenarios.ts
  • packages/opencode/test/kilocode/server/httpapi-exercise-scenarios.ts
Previous Review Summary (commit 78b5777)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 78b5777)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 2
SUGGESTION 0

Fix these issues in Kilo Cloud

Issue Details (click to expand)

WARNING

File Line Issue
packages/opencode/src/kilocode/anaconda-desktop/discovery.ts 183 Chat-only servers are rejected when capabilities.completion is false, even though the provider uses the OpenAI-compatible chat runtime.
packages/opencode/src/kilocode/anaconda-desktop/discovery.ts 346 Discovery stops at the first running server, so one stale or unhealthy server can hide a later healthy server.
Files Reviewed (66 files)
  • .changeset/add-anaconda-desktop-provider.md
  • packages/kilo-docs/lib/nav/ai-providers.ts
  • packages/kilo-docs/pages/ai-providers/anaconda-desktop.md
  • packages/kilo-docs/pages/ai-providers/index.md
  • packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/anaconda-desktop/limited-tools-chromium-linux.png
  • packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/anaconda-desktop/not-installed-chromium-linux.png
  • packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/anaconda-desktop/ready-chromium-linux.png
  • packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/anaconda-desktop/waiting-chromium-linux.png
  • packages/kilo-docs/source-links.md
  • packages/kilo-vscode/src/KiloProvider.ts
  • packages/kilo-vscode/src/anaconda-desktop/bridge.ts
  • packages/kilo-vscode/src/anaconda-desktop/messages.ts
  • packages/kilo-vscode/tests/unit/anaconda-desktop-actions.test.ts
  • packages/kilo-vscode/webview-ui/src/components/settings/AnacondaDesktopDialog.tsx
  • packages/kilo-vscode/webview-ui/src/components/settings/ProviderConnectDialog.tsx
  • packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx
  • packages/kilo-vscode/webview-ui/src/i18n/ar.ts
  • packages/kilo-vscode/webview-ui/src/i18n/br.ts
  • packages/kilo-vscode/webview-ui/src/i18n/bs.ts
  • packages/kilo-vscode/webview-ui/src/i18n/da.ts
  • packages/kilo-vscode/webview-ui/src/i18n/de.ts
  • packages/kilo-vscode/webview-ui/src/i18n/en.ts
  • packages/kilo-vscode/webview-ui/src/i18n/es.ts
  • packages/kilo-vscode/webview-ui/src/i18n/fr.ts
  • packages/kilo-vscode/webview-ui/src/i18n/it.ts
  • packages/kilo-vscode/webview-ui/src/i18n/ja.ts
  • packages/kilo-vscode/webview-ui/src/i18n/ko.ts
  • packages/kilo-vscode/webview-ui/src/i18n/nl.ts
  • packages/kilo-vscode/webview-ui/src/i18n/no.ts
  • packages/kilo-vscode/webview-ui/src/i18n/pl.ts
  • packages/kilo-vscode/webview-ui/src/i18n/ru.ts
  • packages/kilo-vscode/webview-ui/src/i18n/th.ts
  • packages/kilo-vscode/webview-ui/src/i18n/tr.ts
  • packages/kilo-vscode/webview-ui/src/i18n/uk.ts
  • packages/kilo-vscode/webview-ui/src/i18n/zh.ts
  • packages/kilo-vscode/webview-ui/src/i18n/zht.ts
  • packages/kilo-vscode/webview-ui/src/stories/anaconda-desktop.stories.tsx
  • packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts
  • packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts
  • packages/kilo-vscode/webview-ui/src/utils/anaconda-desktop-action.ts
  • packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx
  • packages/opencode/src/kilocode/anaconda-desktop/discovery.ts
  • packages/opencode/src/kilocode/anaconda-desktop/domain.ts
  • packages/opencode/src/kilocode/anaconda-desktop/platform.ts
  • packages/opencode/src/kilocode/anaconda-desktop/provider.ts
  • packages/opencode/src/kilocode/anaconda-desktop/service.ts
  • packages/opencode/src/kilocode/anaconda-desktop/tui/model.ts
  • packages/opencode/src/kilocode/anaconda-desktop/tui/setup.tsx
  • packages/opencode/src/kilocode/cli/cmd/tui/component/dialog-provider.tsx
  • packages/opencode/src/kilocode/provider/metadata.ts
  • packages/opencode/src/kilocode/server/httpapi/groups/anaconda-desktop.ts
  • packages/opencode/src/kilocode/server/httpapi/groups/kilocode.ts
  • packages/opencode/src/kilocode/server/httpapi/handlers/anaconda-desktop.ts
  • packages/opencode/src/kilocode/server/httpapi/server.ts
  • packages/opencode/src/plugin/index.ts
  • packages/opencode/src/provider/models.ts
  • packages/opencode/src/server/routes/instance/httpapi/handlers/provider.ts
  • packages/opencode/test/kilocode/anaconda-desktop/discovery.test.ts
  • packages/opencode/test/kilocode/anaconda-desktop/domain.test.ts
  • packages/opencode/test/kilocode/anaconda-desktop/plugin.test.ts
  • packages/opencode/test/kilocode/anaconda-desktop/service.test.ts
  • packages/opencode/test/kilocode/anaconda-desktop/tui/controller.test.ts
  • packages/opencode/test/kilocode/anaconda-desktop/tui/view.test.ts
  • packages/sdk/js/src/v2/gen/sdk.gen.ts
  • packages/sdk/js/src/v2/gen/types.gen.ts
  • packages/sdk/openapi.json

Reviewed by gpt-5.4-20260305 · Input: 78.5K · Output: 7.7K · Cached: 282.4K

Review guidance: REVIEW.md from base branch main

@lambertjosh

Copy link
Copy Markdown
Contributor Author
image image

@lambertjosh
lambertjosh requested a review from kirillk June 26, 2026 06:12
@lambertjosh

Copy link
Copy Markdown
Contributor Author

@kirillk - can you do an initial review here to see if this makes any sense whatsoever? I tried to slim this down, but it seems like a more traditional configuration based approach is not ideal, as noted in the description... this is a fairly heavy change as a result though.

Curious what you think!

@lambertjosh
lambertjosh merged commit d931216 into main Jun 26, 2026
29 checks passed
@lambertjosh
lambertjosh deleted the married-lathe branch June 26, 2026 16:04
t7tran pushed a commit to t7tran/kilocode that referenced this pull request Aug 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants