You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
app: non-inference providers (e.g. Firecrawl) show "models available" toast and are lumped into generic "Other" category in Connect modal #59141
Misleading connection toast for non-inference providers: When connecting a non-inference provider such as Firecrawl (a web search/scraping provider), the confirmation toast treats it as an LLM inference provider and states "Firecrawl models are now available to use."
Lack of provider segmentation in Connect modal (Other category): In the Connect provider modal, providers of completely different types and billing models (subscriptions, pay-as-you-go inference APIs, and web search tools like Firecrawl) are all lumped together under a single generic "Other" category instead of being properly segmented.
Environment
opencode version: 2.1.4
OS: Windows_NT 10.0.26300 (win32 x64)
Terminal: OpenCode Desktop App (Unavailable: terminal environment variables are not set)
Shell: C:\WINDOWS\system32\cmd.exe
Install/channel: latest (Desktop)
Active plugins: None found in config
Reproduction
Open OpenCode Desktop and open the Connect provider modal.
Scroll to the "Other" category in the provider list and observe that LLM inference providers, subscription services, and non-inference web search providers (like Firecrawl) are all mixed together in the same bucket.
Select Firecrawl, enter the API key, and complete the connection.
Observe the confirmation toast notification.
Expected Behavior
Better category segmentation in the Connect modal: Instead of dumping disparate provider types into a catch-all "Other" category, segment the list by connection and capability type:
Web Search / Tool providers (e.g., Firecrawl, Exa, etc.)
Accurate connection feedback: Connecting a non-inference provider like Firecrawl should display a confirmation message matching its actual capability (e.g., "Firecrawl is now connected and available for web search" instead of referring to "Firecrawl models").
Actual Behavior
In the Connect modal, all non-featured providers—including web search integrations like Firecrawl, subscription providers, and API-key model providers—are mixed together inside a generic "Other" category.
After connecting Firecrawl, a toast notification appears with the message:
Firecrawl connected
Firecrawl models are now available to use.
Additional Context
Reproducible consistently on OpenCode Desktop v2.1.4.
Thanks for the report. I reproduced the misleading toast on 2.1.4, using the web UI served by opencode serve (the same app as the desktop build): Settings → Providers → Show more providers, search "Firecrawl", enter an API key and connect. The toast says "Firecrawl connected — Firecrawl models are now available to use." even though Firecrawl is a web search integration with no models. It still happens on the latest dev (5b41e1f). The screenshots below show the Connect dialog and the toast on both versions, and the script below automates the steps.
About the grouping: the Connect dialog currently has two groups by design, a fixed "Popular" list and an alphabetical "Other" list. Splitting it into subscription, API-key and web search sections would be a new feature rather than a bug fix, so maintainers will treat that part as a suggestion.
Reproduction script (connect-firecrawl.mjs)
// Reproduces #59141: connecting Firecrawl (web search) in the web/desktop app's// Connect dialog shows "Firecrawl models are now available to use."// Prereq: `OPENCODE_SERVER_PASSWORD=pw opencode serve --hostname 127.0.0.1 --port 4096`// (from a project dir, with an isolated HOME), then: node connect-firecrawl.mjsimport{chromium}from"playwright"consturl=process.env.OC_URL??"http://127.0.0.1:4096/"constshots=process.env.SHOTS??"/workspace/repro"constbrowser=awaitchromium.launch()constcontext=awaitbrowser.newContext({httpCredentials: {username: "opencode",password: process.env.OC_PASSWORD??"pw"},viewport: {width: 1400,height: 900},})constpage=awaitcontext.newPage()awaitpage.goto(url)awaitpage.waitForTimeout(4000)// Server login screen: "Use password"if(awaitpage.getByText("Use password").isVisible().catch(()=>false)){awaitpage.getByText("Use password").click()awaitpage.waitForTimeout(500)constinputs=page.locator("input")constn=awaitinputs.count()for(leti=0;i<n;i++){constel=inputs.nth(i)consttype=awaitel.getAttribute("type")constph=((awaitel.getAttribute("placeholder"))??"").toLowerCase()if(type==="password")awaitel.fill(process.env.OC_PASSWORD??"pw")elseif(ph.includes("http")||ph.includes("url")||ph.includes("server"))awaitel.fill(url)}awaitpage.screenshot({path: `${shots}/0-login.png`})awaitpage.getByRole("button",{name: /connect/i}).first().click()awaitpage.waitForTimeout(5000)}awaitpage.screenshot({path: `${shots}/0-home.png`})// Open the Connect provider dialogawaitpage.locator("text=Settings").locator("visible=true").first().click()awaitpage.waitForTimeout(1000)awaitpage.locator("text=Providers").locator("visible=true").first().click()awaitpage.waitForTimeout(1500)awaitpage.screenshot({path: `${shots}/0-providers.png`})constconnect=page.locator(".settings-providers-view-all")awaitconnect.scrollIntoViewIfNeeded()awaitconnect.click()awaitpage.waitForTimeout(1500)awaitpage.screenshot({path: `${shots}/1-connect-dialog.png`})awaitpage.getByPlaceholder(/search/i).last().fill("firecrawl")awaitpage.waitForTimeout(800)awaitpage.locator('[data-provider-id="firecrawl"]').click()awaitpage.waitForTimeout(1500)awaitpage.screenshot({path: `${shots}/2-firecrawl.png`})constinput=page.locator('input[type="password"], input[type="text"]').last()awaitinput.fill("fc-test-dummy-key")awaitinput.press("Enter")awaitpage.waitForTimeout(3000)awaitpage.screenshot({path: `${shots}/3-toast.png`})console.log("BODY TEXT CONTAINS:",(awaitpage.textContent("body")).match(/Firecrawl[^.]{0,80}\./g))awaitbrowser.close()
I traced the toast to the connection callback, which always adds the model-availability sentence even when the refreshed model list is empty. This focused patch keeps the existing “Firecrawl connected” title and only includes the models sentence when models are available. Provider grouping is unchanged.
The app typechecks pass. The patch includes settings regression cases for Firecrawl without models and OpenRouter with models, but I could not execute their UI assertions or capture an after screenshot: Chromium fails at startup with a host permission error. The UI regression remains unverified.
Part 1 is in #59243: when a connection brings no models the toast no longer says "models are now available to use", so Firecrawl reads just "Firecrawl connected".
I left the sentence out instead of adding a new one: every locale dict is typed keyof typeof en, so a new key means editing ~30 locale files, and I did not want to put English in the other languages. Say the word and I will add a proper string with the locales.
Part 2 I did not touch. Splitting "Other" into subscription / API-key inference / web-search providers changes the modal's structure, and it needs your naming — if the provider metadata already carries that split, point me at the field and I will do it as its own PR.
Activity
franjorub commentedon Oct 26, 2026
opencode-agent commentedon Oct 26, 2026
Thanks for the report. I reproduced the misleading toast on 2.1.4, using the web UI served by
opencode serve(the same app as the desktop build): Settings → Providers → Show more providers, search "Firecrawl", enter an API key and connect. The toast says "Firecrawl connected — Firecrawl models are now available to use." even though Firecrawl is a web search integration with no models. It still happens on the latestdev(5b41e1f). The screenshots below show the Connect dialog and the toast on both versions, and the script below automates the steps.About the grouping: the Connect dialog currently has two groups by design, a fixed "Popular" list and an alphabetical "Other" list. Splitting it into subscription, API-key and web search sections would be a new feature rather than a bug fix, so maintainers will treat that part as a suggestion.
Reproduction script (connect-firecrawl.mjs)
Run it:
bun connect-firecrawl.mjsDante-dan commentedon Oct 26, 2026
I traced the toast to the connection callback, which always adds the model-availability sentence even when the refreshed model list is empty. This focused patch keeps the existing “Firecrawl connected” title and only includes the models sentence when models are available. Provider grouping is unchanged.
The app typechecks pass. The patch includes settings regression cases for Firecrawl without models and OpenRouter with models, but I could not execute their UI assertions or capture an after screenshot: Chromium fails at startup with a host permission error. The UI regression remains unverified.
SU-AN-coder commentedon Oct 26, 2026
Part 1 is in #59243: when a connection brings no models the toast no longer says "models are now available to use", so Firecrawl reads just "Firecrawl connected".
I left the sentence out instead of adding a new one: every locale dict is typed
keyof typeof en, so a new key means editing ~30 locale files, and I did not want to put English in the other languages. Say the word and I will add a proper string with the locales.Part 2 I did not touch. Splitting "Other" into subscription / API-key inference / web-search providers changes the modal's structure, and it needs your naming — if the provider metadata already carries that split, point me at the field and I will do it as its own PR.