# Prompt submitted to cloud even when using local LLM by default

> Source: <https://github.com/anomalyco/opencode/issues/15854>
> Published: 2026-07-17 12:00:37+00:00

-
[Notifications](/login?return_to=%2Fanomalyco%2Fopencode)You must be signed in to change notification settings -
[Fork 23.4k](/login?return_to=%2Fanomalyco%2Fopencode)

# Prompt submitted to cloud even when using local LLM by default #15854

Copy link

Copy link

Closed as not planned

Labels

[bugSomething isn't working](https://github.com/anomalyco/opencode/issues?q=state%3Aopen%20label%3A%22bug%22)Something isn't working

[coreAnything pertaining to core functionality of the application (opencode server stuff)](https://github.com/anomalyco/opencode/issues?q=state%3Aopen%20label%3A%22core%22)Anything pertaining to core functionality of the application (opencode server stuff)

## Description

### Description

When using a local model, opencode still sends your prompt to public cloud endpoint [https://opencode.ai/zen/v1/responses](https://opencode.ai/zen/v1/responses) to get a title summary.

For example:

```
opencode run this is a test
```

or even with an explicit model

```
opencode -m local/Qwen/Qwen-Next-Coder run this is a test
```

causes opencode to generate a request

```
POST /zen/v1/responses HTTP/2
Host: opencode.ai
Authorization: Bearer public
Content-Type: application/json
User-Agent: ai-sdk/openai/2.0.89 ai-sdk/provider-utils/3.0.20 runtime/bun/1.3.10
X-Opencode-Client: cli
X-Opencode-Project: global
X-Opencode-Request: msg_cb41776da0013RO7pnTvyuSA0h
X-Opencode-Session: ses_34be88938ffewkdc070WPvraqG
Connection: keep-alive
Accept: */*
Accept-Encoding: gzip, deflate, br
Content-Length: 2574

{
  "model": "gpt-5-nano",
  "input": [
    {
      "role": "developer",
      "content": "You are a title generator. You output ONLY a thread title. Nothing else.\n\n<task>\nGenerate a brief title that would help the user find this conversation later.\n\nFollow all rules in <rules>\nUse the <examples> so you know what a good title looks like.\nYour output must be:\n- A single line\n- ≤50 characters\n- No explanations\n</task>\n\n<rules>\n- you MUST use the same language as the user message you are summarizing\n- Title must be grammatically correct and read naturally - no word salad\n- Never include tool names in the title (e.g. \"read tool\", \"bash tool\", \"edit tool\")\n- Focus on the main topic or question the user needs to retrieve\n- Vary your phrasing - avoid repetitive patterns like always starting with \"Analyzing\"\n- When a file is mentioned, focus on WHAT the user wants to do WITH the file, not just that they shared it\n- Keep exact: technical terms, numbers, filenames, HTTP codes\n- Remove: the, this, my, a, an\n- Never assume tech stack\n- Never use tools\n- NEVER respond to questions, just generate a title for the conversation\n- The title should NEVER include \"summarizing\" or \"generating\" when generating a title\n- DO NOT SAY YOU CANNOT GENERATE A TITLE OR COMPLAIN ABOUT THE INPUT\n- Always output something meaningful, even if the input is minimal.\n- If the user message is short or conversational (e.g. \"hello\", \"lol\", \"what's up\", \"hey\"):\n  → create a title that reflects the user's tone or intent (such as Greeting, Quick check-in, Light chat, Intro message, etc.)\n</rules>\n\n<examples>\n\"debug 500 errors in production\" → Debugging production 500 errors\n\"refactor user service\" → Refactoring user service\n\"why is app.js failing\" → app.js failure investigation\n\"implement rate limiting\" → Rate limiting implementation\n\"how do I connect postgres to my API\" → Postgres API connection\n\"best practices for React hooks\" → React hooks best practices\n\"@src/auth.ts can you add refresh token support\" → Auth refresh token support\n\"@utils/parser.ts this is broken\" → Parser bug fix\n\"look at @config.json\" → Config review\n\"@App.tsx add dark mode toggle\" → Dark mode toggle in App\n</examples>\n"
    },
    {
      "role": "user",
      "content": [
        {
          "type": "input_text",
          "text": "Generate a title for this conversation:\n"
        }
      ]
    },
    {
      "role": "user",
      "content": [
        {
          "type": "input_text",
          "text": "this is a test"
        }
      ]
    }
  ],
  "max_output_tokens": 32000,
  "store": false,
  "include": [
    "reasoning.encrypted_content"
  ],
  "reasoning": {
    "effort": "minimal"
  },
  "stream": true
}
```

This has leaked your private prompt text to the opencode API.

It can be disabled using

```
  "agent":{
    "title": {
      "disable":true
    }
  }
```

The default should be either disabled, or to use the model you specify.

### Plugins

None

### OpenCode version

1.2.15

### Steps to reproduce

Configure a local model

export https_proxy=[http://127.0.0.1:8080](http://127.0.0.1:8080)

export NODE_TLS_REJECT_UNAUTHORIZED=0

run Burp proxy or similar to capture requests

run:

opencode run this is a test

Check Burp to see the request to opencode.ai with "this is a test"

### Screenshot and/or share link

*No response*

### Operating System

Ubuntu 24

### Terminal

*No response*

Reactions are currently unavailable

## Metadata

## Metadata

### Assignees

### Labels

[bugSomething isn't working](https://github.com/anomalyco/opencode/issues?q=state%3Aopen%20label%3A%22bug%22)Something isn't working

[coreAnything pertaining to core functionality of the application (opencode server stuff)](https://github.com/anomalyco/opencode/issues?q=state%3Aopen%20label%3A%22core%22)Anything pertaining to core functionality of the application (opencode server stuff)

### Type

### Fields

No fields configured for issues without a type.
