Table of contents
- 1. Do this first — look for an exact match in the official catalogue
- 2. Which of four layers wrote the error message
- 3. When it says "content filter", whose filter is it?
- 4. Streaming response ended before any complete data was received
- 5. Could not locate the Claude CLI on PATH
- 6. The message we could not trace, and four steps to trace it yourself
- 7. Lookup table — from message to destination
- 8. What is settled and what is not
- FAQ
When Claude stops on you, the first thing you do is search the message you just got, exactly as printed. And for some messages, that search turns up almost nothing. These are examples.
The model returned no content because the response was blocked by content filtering
The response was blocked by the provider's content filter
Streaming response ended before any complete data was received
Could not locate the Claude CLI on PATH
Connection to Claude's response was lost. Claude may still be working
What these five have in common is that they appeared while you were using Claude, yet searching Claude's official documentation seems to turn up nothing. The reason is plain: the program that wrote the message now on your screen is not necessarily the one you think it is.
There is no longer a single route to Claude. The claude command in a terminal, an IDE extension, a different agent such as OpenCode, a path through GitHub Copilot — every one of them decides for itself how to phrase a failure. The same event is worded differently by each layer that writes it.
This article does not explain each individual cause from scratch. It is the entrance hall: identify who wrote the message, then send you to the right explanatory article. The details stay in the existing articles; here we handle only tracing the source. What could be confirmed from primary sources and what could not are kept apart.
Claude Code officially lists the messages it prints. Whether yours matches exactly already narrows down the layer that wrote it. Do this before you start reasoning about the cause.
Third-party tools name a cause in their wording, and a public issue records real cases where that name does not match what happened. Believe the wording and you will fix the wrong place.
Checking the five strings above against the catalogue, two of them were listed in Claude Code's official error reference. You cannot guess the layer from how a message feels.
1. Do this first — look for an exact match in the official catalogue
There is something to do before you start reasoning about the cause: confirm whether the message belongs to Claude Code's own vocabulary.
Claude Code has an official error reference, and it enumerates the messages Claude Code puts on your screen. Authentication, rate limits, context overflow, network, streaming, MCP, plugins — each one appears as the literal display string. So "is the string I saw listed there" is not a guess but a match.
Either Claude Code itself, or a message the docs classify as printed by the launcher. The official explanation and fix apply as written. Two of the five at the top landed here.
Another program most likely paraphrased it. A named cause is sometimes added during that paraphrase, so do not take the name at face value.
That message is the vocabulary of the tool you are using. What you should be searching is not Anthropic's material but that tool's repository and its issues.
2. Which of four layers wrote the error message
Break the route to Claude apart and there are four places that can write a string when something fails. Which layer wrote it changes how you read it and where a fix will land.
The Anthropic API, but also Amazon Bedrock, Google Vertex AI, the GitHub Copilot gateway and others. The HTTP status and the JSON error.message often reach the screen unchanged.
Example: Output blocked by content filtering policy
A note the CLI adds on its own judgement. Being listed verbatim in the official error reference is the mark of this layer, and the meaning and recovery steps are documented.
Example: Streaming response ended before any complete data was received
Printed by whatever tried to launch Claude Code and failed. The official reference gives these a separate chapter, "Wrapper and IDE errors", and describes them as printed by the launching program rather than by Claude Code itself.
Example: Could not locate the Claude CLI on PATH
Another agent that calls Claude as its model. The wording is written by that project itself and does not exist in the official catalogue. It frequently names a cause, and that name can miss.
Example: The response was blocked by the provider's content filter
Of these four, layer ④ is the one most easily misread. Layers ① to ③ tend to state what happened, whereas layer ④ wording often goes all the way to why it happened. That assertion, however, is no more than an inference made by that tool. The next chapter works through a documented example.
3. When it says "content filter", whose filter is it?
Two of the five listed at the top both say the response was blocked by a content filter. This is where the mix-up is most likely, because using Claude does not mean it was Anthropic's filter that stopped you.
3-1. The model returned no content because the response was blocked by content filtering
🟡 Source (observation only): the one primary source where this string could be confirmed verbatim was Issue #3348 in github/copilot-cli, in GitHub's own repository. Its title reads "Repeated 'The model returned no content because the response was blocked by content filtering' on legitimate technical reasoning turns", carrying the string as it is. However, the author withdrew the body, and no technical answer from a maintainer is attached. The status is closed as not planned. The string itself is not visible in GitHub's public documentation. This article therefore claims nothing beyond "it is a message reported in GitHub Copilot CLI".
On the other hand, ✅ one thing can be stated with certainty. GitHub's official documentation, Hosting of models for GitHub Copilot, is explicit about what happens when you use Claude.
"When using Claude, input prompts and output completions continue to run through GitHub Copilot's content filters for public code matching, when applied, along with those for harmful or offensive content."
In other words, when you use Claude through Copilot, there is also a filter on GitHub's side that can stop the output. The same page goes on to describe the hosting for the Claude models available in Copilot as "Amazon Web Services, Anthropic PBC, and Google Cloud Platform" — which means you are not necessarily on a setup that calls Anthropic's api.anthropic.com directly.
Output blocked by content filtering policy you get directly from the Anthropic API or Claude Code is mainly an output filter stopping the reproduction of existing copyrighted work, and the fix leans towards not asking for verbatim copies (see Output blocked by content filtering policy: causes and fixes). Through Copilot, though, GitHub itself writes that matching against public code is also inspected. If the work produces output resembling existing code, that may be where it is being stopped. The same phrase "content filtering" does not guarantee the same thing is being inspected.
One test is enough to separate them. Run the same prompt through the claude command in your terminal, which is a route straight to Anthropic. If it passes there and only Copilot CLI stops, the thing stopping you is not Anthropic's filter. If both stop, the judgement is likely coming from the side that serves the model.
3-2. The response was blocked by the provider's content filter
✅ Source (confirmed): this string belongs to OpenCode, an open-source coding agent. Issue #35736 in the repository anomalyco/opencode reports the wording verbatim.
And this issue is the single example this article most wants to convey. Its title says that Vertex provider errors — a 404, a socket drop, and stop_reason:refusal — all surface as the same "blocked by content filter".
The model does not exist in the region you configured. The issue's example is claude-opus-4-8@default. This is nothing but a configuration mistake and has no connection to any filter.
The connection to the Vertex API broke during a long session. A network event, in which the content of the output was never even judged.
HTTP 200 comes back carrying stop_reason: refusal and a safety category (cyber in the issue's example). This one alone matches the wording.
Of the three, the wording is correct for exactly one. Yet the screen shows the same sentence for all of them. That is why layer ④ wording must not be taken at face value — read it as "blocked by a filter" and soften your phrasing, and if the reality is a 404 you will never fix it. What needs fixing is the model ID and region setting.
The same repository also carries Issue #35643, "you are still billed for what was generated even when the content filter blocks the output". Both were open when this article was written.
So the order to try is this. ① Confirm that the model ID and region you configured are a combination that actually exists. ② See whether the same prompt reproduces it or whether it is sporadic, since sporadic points at the connection side. ③ If you can capture the raw response, look at stop_reason. Only once ③ shows refusal may you treat this as a problem with the content.
4. Streaming response ended before any complete data was received — this one was Claude Code's own wording
From here we take the two that look like third-party wording but are in fact part of Claude Code's official vocabulary.
✅ Confirmed: this string exists as an entry in the Claude Code official error reference. And the official explanation is not what most people picture.
"The API returned response headers, but the response body contained no Claude API message."
So it is not "it came partway and then cut off". It is "not one piece of content ever arrived". The words Streaming and ended make it easy to read this as a line dropping while the response was flowing, but the official definition points at a state where only headers came back and the body was empty. Get that wrong and you will spend a long time trying disconnection remedies.
The official guidance offers two moves. ① Send it again — the original message is still in the conversation, so there is no need to paste a long prompt back in; typing try again is enough. ② If it happens every time, suspect the network, the proxy, or the provider's gateway — the docs route you to the "Unable to connect to API" entry.
What backs up this reading is the sibling entries sitting next to it. The official reference has API returned an empty or malformed response (the headers indicate success, but the body is not a valid Claude API message), and it even has Bedrock streaming response has content-type "..."; expected "application/vnd.amazon.eventstream", an entry that names the gateway returning content of the wrong type. This whole family is the "a 200 came back, but the content is not Claude's response" kind.
Streaming response ended before any complete data was receivedAPI returned an empty or malformed response
Suspect the route: a corporate proxy, TLS termination, an API gateway, a relay sitting in front of Bedrock or Vertex. See the article on network, proxy and TLS certificate errors
Connection lost mid-responseThe response stopped arriving
Here whatever reached the screen is kept, and continue resumes from where it stopped. See the article on Connection lost mid-response
5. Could not locate the Claude CLI on PATH — wording the docs classify as printed by the launcher
✅ Confirmed: this string is in the official error reference too. Where it sits matters, though: it is in a separate chapter called "Wrapper and IDE errors". The docs describe that chapter as errors printed by the launching program rather than by Claude Code itself.
The official definition is that the launching program could not find the claude command on the system PATH. Two fixes are given.
- Reinstall. The installer adds
claudeto PATH - Put the install location on PATH. On macOS and Linux this is usually
~/.local/binor/usr/local/bin; on Windows it is usually%APPDATA%\Anthropic\Claude\binorC:\Program Files\Anthropic\Claude\bin
But here is the thing: the message that actually reaches your screen can be longer than the heading in the official catalogue. Issue #80087 in anthropics/claude-code records the real thing a VS Code extension printed, verbatim.
Could not locate the Claude CLI on PATH. Launching by name in a PowerShell terminal would run a 'claude' from the open folder instead of the installed CLI, so the launch was blocked. Make sure the Claude CLI's install directory is on your system PATH (not only your PowerShell profile), then restart VS Code and try again.
The second half is explanation the extension added on its own. That is why searching turns up nothing, and why the right move is to search only the first sentence. This holds for layer ③ wording generally: the launcher grafts its own circumstances onto the official heading.
claude works fine while only the extension fails. It worked on v2.1.212 and reproduced on v2.1.214 and v2.1.217, so they suspect a regression introduced in v2.1.214. The suspected cause is how Windows' where.exe output is handled in environments where the username contains non-ASCII characters, but that is the reporter's inference, not an established cause. The issue was open when this article was written, and pinning the extension to v2.1.212 is listed as a workaround.
One line is enough to isolate this. Type claude --version in your terminal. If a version prints there and only the extension fails, what is broken is not the CLI but the PATH the launcher sees. When you start an editor from its icon, the PATH that process receives can differ from the PATH your login shell assembles. The case where the install itself never completed is covered in the article on command not found.
6. The message we could not trace, and four steps to trace it yourself
For one of the five at the top — Connection to Claude's response was lost. Claude may still be working — 🔴 the source could not be identified. This article names no tool for it.
What was searched, and what came of it, is on the record. Every entry in the Claude Code official error reference was read through, and this string was not among them. The official documentation for Remote Control, the feature that continues a local session from a phone or a browser, was read in full as well, and it was not there either. The closest official wording is Connection lost mid-response and Couldn't reconnect to your Remote Control session, and neither string matches.
So it is either layer ③ or layer ④, but which tool wrote it has not been confirmed. The phrasing "Claude may still be working" hints that whoever wrote it is not the one running Claude — that they are watching another process or another machine from outside — but this is 🟡 an inference from the phrasing, with no confirmation behind it.
Here is a procedure that lets you settle cases like this yourself. It applies to every case in the previous chapters as well.
Did it appear mixed into the flow of Claude's response, or in the frame, notification or panel outside it? If it is outside, layer ③ or layer ④ wrote it.
claudeRun the same work through the terminal's claude. If it does not reproduce, the wording belongs to that tool. If it does, descend to layer ① or layer ②.
Search the official error reference inside your browser. Search only the first sentence, because the rest may be grafted on by the launcher (Chapter 5).
If it is not official, the place to look is not Anthropic's material. Search the string in the issues of the repository of the tool you use. That is how the sources in this article were traced.
7. Lookup table — from message to destination
Here is everything above on one sheet. The "who wrote it" column is what decides how far you may trust the message.
| Message on screen | Written by | What is actually happening | Where to go |
|---|---|---|---|
The model returned no content because the response was blocked by content filtering |
🟡 Layer ④ wording reported in GitHub Copilot CLI |
Output stopped by a filter. But it may be GitHub's filter, which also inspects matches with public code | The output filter article |
The response was blocked by the provider's content filter |
✅ Layer ④ OpenCode |
Three possibilities: a 404 on the model ID, a dropped connection, or a genuine refusal. Only the third matches the wording | The isolation steps in Chapter 3 |
Streaming response ended before any complete data was received |
✅ Layer ② Claude Code itself (official) |
Headers arrived but the body was empty. It did not cut off partway. Suspect the route: proxies and gateways | The network and proxy article |
Could not locate the Claude CLI on PATH |
✅ Layer ③ the launcher (stated officially) |
claude is not on the PATH the launcher sees. The CLI itself is often perfectly healthy |
The command not found article |
Connection to Claude's response was lost. Claude may still be working |
🔴 not identified absent from the official catalogue |
Undetermined. The closest official wording is Connection lost mid-response |
The four steps in Chapter 6 and the article on the closest official wording |
Read the table across and you can see that only the two layer ④ rows wobble in the "what is actually happening" column. Layers ② and ③ have official definitions, so they do not wobble. That difference is exactly the difference in how far the wording can be trusted.
8. What is settled and what is not
Streaming response ended…andCould not locate the Claude CLI on PATHboth exist as entries in the Claude Code official error reference- The docs place the latter under "Wrapper and IDE errors" and describe it as printed by the launching program
- The former means "headers came back but the body holds no Claude API message" — not a mid-way cut
- OpenCode's Issue #35736 reports that a 404, a dropped connection and a genuine refusal all produce the same wording
- GitHub officially states that even when using Claude, input and output pass through GitHub Copilot's content filters
- The source of
The model returned no content because…. The only verbatim confirmation is the title of Issue #3348 in github/copilot-cli, whose body was withdrawn - The cause given for the VS Code extension regression in Issue #80087, the handling of
where.exeoutput, is the reporter's inference - Which OpenCode code emits the wording is not stated in the issue
- That "Claude may still be working" is how a watcher of another process would phrase it is an inference from the wording
- Which tool emits
Connection to Claude's response was lost…. It was in neither the official error reference nor the Remote Control documentation - A technical explanation from GitHub for that Copilot CLI wording (Issue #3348 is closed as not planned, with no maintainer answer attached)
- Completion of a fix for OpenCode's two issues (both open when this article was written)
It comes down to this. You cannot tell from the look of a message which layer wrote it. All five at the top look like something a third-party tool wrote, yet two were official, two were third-party, and one is unknown. So the first move is not reasoning about causes but matching against the official catalogue. It takes a minute, and it decides where you search next.
FAQ
Q1. I am using Claude, but I cannot find the message anywhere in Anthropic's documentation.
Anthropic may not have written it. Tools that call Claude as their model — IDE extensions, other coding agents, use through Copilot and so on — each decide their own phrasing for a failure. Look for an exact match in the official error reference first, and if it is not there, search the string in the issues of the repository of the tool you are using.
Q2. If it says "content filter", does that mean I hit Anthropic's filter?
Not necessarily. GitHub's official documentation states that even when using Claude, input prompts and output completions run through GitHub Copilot's content filters. And in OpenCode, Issue #35736 reports cases where a 404 or a socket drop, neither of which involves any filter, is shown with the same "content filter" wording. Run the same prompt through the terminal's claude as well and separate the cases by whether it reproduces.
Q3. Does Streaming response ended before any complete data was received mean the connection dropped?
No. The official error reference defines it as "the API returned response headers, but the body contained no Claude API message". It is not that part of it arrived and then cut off; it is that no content arrived at all. Send it again first, where try again is enough, and if it happens every time, suspect the route: proxies, gateways and so on.
Q4. claude works in my terminal, but only the IDE extension says "Could not locate the Claude CLI on PATH".
The problem is the launcher, not the CLI. The official reference classifies this wording under "Wrapper and IDE errors", meaning it is printed by the launching program rather than by Claude Code itself. When you start an editor from its icon, the PATH that process receives can differ from the PATH your login shell assembles. There are also reports of regressions tied to an extension version, such as Issue #80087.
Q5. Does searching turn up nothing because the error is rare?
More often it is because the string is too long. Layer ③ wording sometimes has the launcher's own explanation grafted onto the official heading; in the example in Chapter 5, the official heading is one sentence while the actual display ran to four. Search only the first sentence.
Q6. Should I never act on the cause the message names?
It depends on the layer. Wording that matches the official catalogue exactly, layers ② and ③, has documented meaning and fixes, so following it is fine. The problem is layer ④. OpenCode's Issue #35736 reports that three completely different failures all end up as the same "blocked by the content filter" sentence. When the reality is a configuration mistake, believing the wording and rewriting your phrasing will never fix it.
Q7. Would it be simpler to stop using third-party tools?
There is no need to go that far. What is at issue here is not whether a tool is good but only where the wording of a failure came from. Trying to reproduce it once on bare claude during isolation is enough as a practice. For choosing between tools, see the comparison of Cursor, Claude Code, GitHub Copilot and Codex.
Q8. How do I fix Connection to Claude's response was lost. Claude may still be working?
This article could not identify its source. The string is in neither the Claude Code official error reference nor the Remote Control documentation. It was therefore written either by a launcher or by a third-party client, but since we could not confirm which tool, this article names none. Use the four steps in Chapter 6 to identify it in your own environment. For the phenomenon of a response cutting off partway, the article on the closest official wording, Connection lost mid-response, is a useful reference.
Related articles
- API Error: 400 Output blocked by content filtering policy: Causes and Fixes (Claude Code)
- Claude Code "command not found: claude": Install and PATH Error Fixes
- Claude Code Network, Proxy and TLS Certificate Errors (Unable to connect): Causes and Fixes
- API Error: Connection lost mid-response — Causes and Fixes for the Error v2.1.227 Renamed
- Claude Code repeats "court" infinitely and halts with Response stalled mid-stream: causes and fixes
- Claude Code MCP Server Will Not Connect (failed / needs authentication): Causes and Fixes
- Claude Code Common Errors and Fixes — The Complete Reference
- Cursor vs Claude Code vs GitHub Copilot vs Codex — How to Choose the Big Four
Primary sources used
- Claude Code — Error reference (official documentation): the definitions of
Streaming response ended before any complete data was receivedandAPI returned an empty or malformed response, the definition and fixes forCould not locate the Claude CLI on PATH, and the placement of "Wrapper and IDE errors" - Claude Code — Remote Control (official documentation): confirmation that
Connection to Claude's response was lostis not listed there - anomalyco/opencode Issue #35736: a Vertex 404, a socket drop and
stop_reason:refusalall surfacing as the same "blocked by content filter" (open) - anomalyco/opencode Issue #35643: being billed for what was generated even when the content filter blocks it (open)
- GitHub Docs — Hosting of models for GitHub Copilot: that input and output pass through GitHub Copilot's content filters when using Claude, and where the Claude models are hosted
- github/copilot-cli Issue #3348: the verbatim
The model returned no content because the response was blocked by content filtering(title only; the body was withdrawn and it is closed as not planned) - anthropics/claude-code Issue #80087: the full text of the message a VS Code extension prints, and the behavioural difference across v2.1.212, v2.1.214 and v2.1.217 (open)
- OpenCode official site