HKUDS/DeepTutor · error · ValueError

Embedding response parsed successfully but no vectors were f

Error message

Embedding response parsed successfully but no vectors were found.

What it means

The response JSON parsed and matched a known schema, but every extracted vector list was empty — e.g. "data": [] with HTTP 200. The provider acknowledged the request but returned zero embeddings, which is indistinguishable from a broken endpoint downstream.

Source

Thrown at deeptutor/services/embedding/adapters/openai_compatible.py:358

                    logger.warning(
                        f"Embedding request transport error ({type(exc).__name__}: {exc}) "
                        f"on attempt {attempt + 1}/{1 + self._MAX_RETRIES}, "
                        f"retrying in {wait:.1f}s..."
                    )
                    await asyncio.sleep(wait)
                else:
                    logger.error(
                        f"Embedding request failed after {1 + self._MAX_RETRIES} attempts "
                        f"({type(exc).__name__}: {exc})"
                    )
                    raise
        else:
            if last_exc:
                raise last_exc

        embeddings = self._extract_embeddings_from_response(data)
        if not embeddings:
            raise ValueError("Embedding response parsed successfully but no vectors were found.")

        actual_dims = len(embeddings[0]) if embeddings else 0
        expected_dims = request.dimensions or self.dimensions
        model_name = data.get("model") if isinstance(data, dict) else None
        if not model_name:
            model_name = model

        if expected_dims and actual_dims != expected_dims:
            logger.warning(
                f"Dimension mismatch: expected {expected_dims}, got {actual_dims}. "
                f"Model '{model_name}' may not support custom dimensions."
            )

        logger.info(
            f"Successfully generated {len(embeddings)} embeddings "
            f"(model: {model_name}, dimensions: {actual_dims})"
        )

View on GitHub (pinned to 3e82f13042)

Solutions

  1. Check that request.texts is non-empty before calling embed
  2. Inspect the raw response body (attach logging) to see what the provider returned for the same input
  3. If the gateway consistently returns empty data for valid input, report/switch — it is a provider-side bug
  4. Retry once: transient empty responses do occur on overloaded proxies

Example fix

# before
resp = await adapter.embed(EmbeddingRequest(texts=[]))
# after
if not texts:
    return empty_response
resp = await adapter.embed(EmbeddingRequest(texts=texts))
Defensive patterns

Strategy: validation

Validate before calling

if not request.texts and not request.contents:
    return EmbeddingResponse(embeddings=[], model=request.model or "", dimensions=0)
# drop empty strings that some gateways choke on
request.texts = [t for t in request.texts if t and t.strip()]

Type guard

null

Try / catch

try:
    resp = await adapter.embed(req)
except ValueError as e:
    if "no vectors were found" in str(e):
        resp = await adapter.embed(req)  # one retry; transient on overloaded proxies
        if not resp.embeddings:
            raise
    raise

Prevention

When it happens

Trigger: Provider returns {"data": []} for an empty input list, a model that produced no output, or a gateway bug; also when input texts were all filtered out server-side.

Common situations: Calling embed() with an empty texts list; gateway returning 200/empty-data on overload; provider silently dropping malformed inputs.

Related errors


AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27). Data as JSON: /api/errors/f46ac76b38383ef9. Report an issue: GitHub.