opencode icon indicating copy to clipboard operation
opencode copied to clipboard

[FEATURE]: Add option to disable models.dev fetch for corporate proxy environments

Open emvnuel opened this issue 1 month ago • 2 comments

Feature hasn't been suggested before.

  • [x] I have verified this feature I'm about to request hasn't been suggested before.

Describe the enhancement you want to request

Problem

Users behind corporate proxies experience issues with OpenCode 1.x.x versions due to a network call made on startup to https://models.dev/api.json. This call happens unconditionally and does not respect HTTP_PROXY/HTTPS_PROXY environment variables since Bun's native fetch() doesn't automatically handle proxy configuration.

Version 0.15.31 worked fine because this fetch behavior was either not present or handled differently.

Current Behavior

In packages/opencode/src/provider/models.ts, the get() function always calls refresh() which makes a network request:

export async function get() {
  refresh()  // Always calls fetch to models.dev
  const file = Bun.file(filepath)
  const result = await file.json().catch(() => {})
  if (result) return result as Record<string, Provider>
  const json = await data()
  return JSON.parse(json) as Record<string, Provider>
}

The code does have fallback mechanisms (local cache + bundled data), but the fetch is attempted regardless.

Proposed Solution

Add a configuration option to disable network calls, e.g.:

{
  "offline": true
}

Or more granularly:

{
  "experimental": {
    "disable_models_fetch": true
  }
}

When enabled, OpenCode would skip the models.dev fetch and rely on:

  1. Cached data at ~/.cache/opencode/models.json
  2. Bundled model data (compiled via macro)

Workaround

Currently, users can whitelist models.dev in their corporate proxy, but this isn't always possible in restricted environments.

Environment

  • OpenCode version: 1.x.x (works in 0.15.31)
  • Issue: Corporate proxy blocking/timing out on models.dev fetch

emvnuel avatar Dec 01 '25 23:12 emvnuel

This issue might be a duplicate of existing issues. Please check:

  • #531: Support HTTP_PROXY & HTTPS_PROXY for users behind firewalls and corporate proxies
  • #3989: acp-command unhandled rejection when http_proxy is set (similar crash behavior in 1.x.x)
  • #4284: Socket connection error with ProxyChains from v1.0.0 (proxy-related networking issues)
  • #3053: Stuck After Compaction with long calls to models.dev (related to models.dev fetch blocking)
  • #2224: Support for airgapped installation (offline environment support)

Feel free to ignore if none of these address your specific case.

github-actions[bot] avatar Dec 01 '25 23:12 github-actions[bot]

yep this is a good idea i was toying around with it

thdxr avatar Dec 02 '25 00:12 thdxr

I think experimental.skip_models_fetch would be a better name. After all, we're not trying to disable the ability to fetch updated model lists (opencode models --refresh should keep working), we're just trying to skip the automatic fetching of the updated list.

ariane-emory avatar Dec 02 '25 12:12 ariane-emory

We might be able to achieve this simply by not enabling the 60 minute model refresh timer when experimental.skip_models_fetch == true? Need to look into how viable that is, but it sounds like it could work.

ariane-emory avatar Dec 04 '25 06:12 ariane-emory