Skip to content

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

Closed as not planned

Description

@foob61451

Description

When using a local model, opencode still sends your prompt to public cloud endpoint 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
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

Activity

  1. added
    coreAnything pertaining to core functionality of the application (opencode server stuff)
    on Mar 3, 2026
  2. github-actions commented on Mar 3, 2026

    @github-actions
    Contributor

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

    • OpenCode is not private by default? #10416: Same issue — session title is generated via the opencode.ai cloud endpoint even when using a local model, raising privacy concerns about prompt data leaving the local network.
  3. github-actions commented on May 3, 2026

    @github-actions
    Contributor

    To stay organized issues are automatically closed after 60 days of no activity. If the issue is still relevant please open a new one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingcoreAnything pertaining to core functionality of the application (opencode server stuff)

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions