Override OpenAI Base URL sends Responses API payload to /chat/completions but expects Chat Completions output

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

I am new to Cursor and using it with an OpenAI-compatible base URL. I set the OpenAI Base URL and Model in the Cursor IDE under Settings → Models → API Keys. Then I clicked Toggle Agents and sent a message to GPT 5.5 with medium reasoning.

I first got this error from my OpenAI-compatible endpoint:

Missing required parameter: ‘messages’

To debug, I put a small logging proxy in front of my endpoint and captured the request shape. When digging into it it appears that Cursor sends:

POST /openai/v1/chat/completions

But the JSON body is Responses API shaped, not Chat Completions shaped. It includes fields like:
{
“model”: “gpt-5.5”,
“input”: […],
“stream”: true,
“include”: [“reasoning.encrypted_content”],
“reasoning”: {“effort”: “medium”, “summary”: “auto”},
“text”: {“verbosity”: “low”},
“stream_options”: {“include_usage”: true}
}

This gets rejected by a Chat-Completions compatible endpoint because chat/completions expects messages, not input.

Then I tested a proxy workaround by:

  1. Rewriting /openai/v1/chat/completions to /openai/v1/responses.
  2. Remove stream_options from the request. From what I can tell, the Responses API supports stream_options: {"include_obfuscation": false}, but Cursor is sending stream_options: {"include_usage": true}, which seems specific to the Chat Completions API. This needed to be removed for the Responses request to succeed.
  3. Forwarding the Responses-shaped body upstream.

That makes the upstream request succeed. However, Cursor still does not render anything unless the proxy also translates the Responses SSE output back into Chat Completions streaming chunks using choices[].delta.

So Cursor appears to be using:

  • Request path: Chat Completions
  • Request body: Responses API
  • Expected output parser: Chat Completions streaming

Steps to Reproduce

Steps to reproduce:

  1. Configure Cursor with a custom OpenAI-compatible base URL.
  2. Use model gpt-5.5 with reasoning enabled.
  3. Send any prompt.
  4. Log the outbound request path and top-level JSON body keys.
  5. Observe that Cursor posts to /chat/completions with a Responses-style input body.

Expected Behavior

Expected behavior should be one of:

  1. Send Responses-shaped bodies to /v1/responses and parse Responses shaped results
  2. Or send Chat Completions-shaped bodies to /v1/chat/completions and parse Chat Completions chunks.

Operating System

MacOS

Version Information

Version: 3.2.14
VSCode Version: 1.105.1
Commit: 6e821a7fc68d5ce5b4ab821f73fe4137e0851e60
Date: 2026-04-28T13:25:40.706Z
Layout: editor
Build Type: Stable
Release Track: Default
Electron: 39.8.1
Chromium: 142.0.7444.265
Node.js: 22.22.1
V8: 14.2.231.22-electron.0
OS: Darwin arm64 25.3.0

For AI issues: which model did you use?

GPT 5.5

Does this stop you from using Cursor

No - Cursor works, but with this issue

Hey, thanks for the detailed report. The proxy-level breakdown path vs body vs parser is super helpful.

This is a known bug. When you use Override OpenAI Base URL with models that go through the Responses API path GPT-5 family, o3, o4, gpt-4*, Cursor sends a Responses-shaped body to /chat/completions. We’re tracking it, but I can’t share an ETA for a fix yet.

Canonical thread for the same issue: Cursor Agent sends Responses API format to /chat/completions endpoint. I’ll close this one as a duplicate so the discussion stays in one place. Your note about stream_options: {include_usage: true} a Chat Completions-only field that ends up in a Responses request is a helpful detail, I’ll add it to the existing report.

Workarounds for now are either what you already did proxy with path rewrite plus SSE conversion on the way out, or use a model that doesn’t trigger the Responses path. When the fix ships, we’ll update the canonical thread.