# How to write great bug reports

## Write great bug reports!

This page outlines what an ideal bug report would look like. We know that it is
not always possible to write a perfect bug report, and we don't want to
discourage you from reporting a bug just because you might not be able to
provide all the info needed to make the report great. At the same time we want
to provide you with the information to make the lives of our engineers a bit
easier. Sometimes we also need to prioritize and decide about which bug ticket
to pick up first. If a bug report is well-prepared, it has a greater chance of
being picked up first.

### What makes a great bug report stand out?

Here are some points that make a bug report great:

- **Providing Context**
  When you have been working on a specific use-case or fighting against a
  specific bug for ages there is probably a lot of context in your or your
  teams' head(s). Sometimes this context gets lost when handing over a bug
  report to one of our engineers. Since they have probably been working on
  something completely different before, it may be difficult for them to
  understand all your goals and assumptions that are like second-nature to you.
  A great bug reports sets that context and makes sure that any engineer -
  whether an inside our outside contributor - can get started on this ticket
  easily.

- **Right level of information**
  Depending on the kind of bug, there is a different need for information.
  Let's consider two different possible bugs: For the first one an image when
  using the `img2vec` module was not vectorized correctly and your results are
  off because of it. For the second one, consider a scenario where you a
  performing a lookup by id and it is much slower than you think it should be.
  Those are both valid bugs, but we need different kind of information for
  each. For example, for the image-vectorization bug we need to know a lot of
  the details about the `img2vec` module: What versions were used? Which
  inference container was running? Was there a GPU involved? What file format
  did the image have? But looking at the performance bug, we probably need more
  info regarding your hardware. How was the machine sized? What kind of disks
  were used? What were the vitals (CPU usage, Memory usage, Disk pressure)
  during the slow query, etc.? We do not expect you to know all the internals
  of Weaviate, but we ask you to think about what details may be helpful in
  reproducing the bug and which are most likely superfluous.

- **Quick to reproduce**
  Every bug is important and we are happy about every single report. However,
  we must still prioritize. A bug report that is easier for us to reproduce is
  a bug report we might prefer. A great bug report contains a reproducing
  example that makes no assumptions about prior state and reproduces be bug in
  its entirety. Below are some examples for a great reproducing example in a
  bug report.

- **Narrowed down to a particular area**
  Weaviate is more than just the Weaviate server, it's an entire ecosystem that
  often contains the Weaviate Server, a language-specific Weaviate client and
  any number of optional modules. Those modules may bring their own inference
  containers if they make use of a Machine-Learning model. A great bug report
  tries to narrow down where the problem goes wrong. There are some helpful
  tips below to see how you can find out where the bug occurs.

Now that we have established _what_ makes a great bug report, let's look at
some of the individual areas and see _how_ we can write better reports.

## What is the minimal information and context that should always be provided?

- Make sure that all the versions used are explicitly listed. This includes at
  the minimum the version of the Weaviate server and the client.
- Is there a chance that the bug was introduced in a recent version? In this
  case, report the last version that does not have the specified issue.
- Is there module involved that is vital to reproducing the bug? If so, specify
  the module. If the module uses different models, specify the model names too.

## How do I provide a good reproducing example?

- A great reproducing example makes zero assumptions about state. This means
  that the example always starts with an empty Weaviate instance and imports
  any object that is required to reproduce the bug. Our engineers cannot predict
  what kind of objects should be imported based on a read/search query.
- Anything that is required to reproduce the error is part of the reproducing
  example. Our engineers should be able to copy/paste the example and
  immediately see that something is wrong.
- The reproducing example is expressed as code. This could be one of Weaviate's
  language clients or a series of `curl` commands.
- The reproducing example tells us what you expected to happen. In some cases
  it might not be obvious why the actual behavior is not the desired behavior.
  Let us know what you expected to happen instead. This can be either in
  the form of code, a code comment, or text accompanying your example.

## How do I know if a problem occurs in Weaviate, a client or somewhere else?

- If you have a suspicion that a problem doesn't actually occur in the Weaviate
  server, but possibly in one of the clients, you can verify sending a similar
  request using a different language client or no language client. The latter
  case is the best as it rules out client problems altogether. If you can
  still reproduce the error by sending a request using pure HTTP (e.g. via
  `curl`, Postman, etc.), you can be sure that the error occurs on the Weaviate
  server-side.
- If you see a stack trace from your language-client you can make an educated
  guess about where the error occurred. If the stack trace contains a network
  request, a non-2xx HTTP status code or an error message containing
  information about shards and indexes, there is a good chance the bug occurred
  inside the Weaviate server. If you see something that is very specific to the
  client's language however, it may be an indication that the error occurred in
  the client.
- If you are using any other tools from the Weaviate eco-system, for example
  the `weaviate-helm` repository to run on Kubernetes, there is also a chance
  that something goes wrong there. If you think that the bug might be specific
  to the runtime and its manifests, it might make sense to also try the setup
  on a different runtime. Let us know what you have already tried.

## What if it's not feasible to provide the information mentioned above?

Don't worry about it. We know that sometimes bugs are tricky and not so easy to
reproduce. If it is simply not feasible to write a perfect bug report, write one
anyway. We are very happy when we see that you made an effort to write a good
report.

## Thank you

A bug report is a contribution to Weaviate. We are really thankful for you
taking the time to report the issue and helping us improve Weaviate. Thank you!

## Related pages

- [Agents](./agents-index.md)
- [AI-assisted Weaviate code generation](./ai-assisted-vibe-coding-index.md)
- [APIs](./apis-index.md)
- [Authorization and authentication](./authorization-and-authentication-index.md)
- [Benchmarks](./benchmarks-index.md)
- [Best practices](./best-practices-index.md)
- [Client libraries](./clients-index.md)
- [Client Libraries / SDKs](./client-libraries-index.md)
- [Cloud](./cloud-index.md)
- [Cloud account management](./cloud-account-management-index.md)

# Agent Instructions

This portal answers questions programmatically. To receive a synthesized,
source-cited answer instead of crawling page by page, append the `?ask=`
query parameter to any page URL on this site:

    /guides/quickstart?ask=how+do+I+authenticate

Optional parameters:

- `&goal=<what-you-are-trying-to-do>` steers the answer toward your
  objective (e.g. `&goal=write+a+python+client`).
- `&version=<label>` scopes the answer to a mounted version when the
  portal publishes more than one.

The response is `text/markdown`: the answer followed by a `# Sources` list
of the portal pages it was grounded in. Status codes are the contract:

- `200` — the answer; `402` — the portal owner’s plan or answer credits are
  exhausted (surface this to your operator; do NOT retry); `429` — you are
  rate-limited; back off for the `Retry-After` seconds; `503` — the answer
  lane is temporarily unavailable; fall back to crawling the `.md` pages.

For the full corpus map read `llms.txt` at the site root; for the tool
surface (search + page fetch as MCP tools) see `/mcp`.
