{"record":{"id":"f46ac76b38383ef9","repo":"HKUDS/DeepTutor","slug":"embedding-response-parsed-successfully-but-no-vect","errorCode":null,"errorMessage":"Embedding response parsed successfully but no vectors were found.","messagePattern":"Embedding response parsed successfully but no vectors were found\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"deeptutor/services/embedding/adapters/openai_compatible.py","lineNumber":358,"sourceCode":"                    logger.warning(\n                        f\"Embedding request transport error ({type(exc).__name__}: {exc}) \"\n                        f\"on attempt {attempt + 1}/{1 + self._MAX_RETRIES}, \"\n                        f\"retrying in {wait:.1f}s...\"\n                    )\n                    await asyncio.sleep(wait)\n                else:\n                    logger.error(\n                        f\"Embedding request failed after {1 + self._MAX_RETRIES} attempts \"\n                        f\"({type(exc).__name__}: {exc})\"\n                    )\n                    raise\n        else:\n            if last_exc:\n                raise last_exc\n\n        embeddings = self._extract_embeddings_from_response(data)\n        if not embeddings:\n            raise ValueError(\"Embedding response parsed successfully but no vectors were found.\")\n\n        actual_dims = len(embeddings[0]) if embeddings else 0\n        expected_dims = request.dimensions or self.dimensions\n        model_name = data.get(\"model\") if isinstance(data, dict) else None\n        if not model_name:\n            model_name = model\n\n        if expected_dims and actual_dims != expected_dims:\n            logger.warning(\n                f\"Dimension mismatch: expected {expected_dims}, got {actual_dims}. \"\n                f\"Model '{model_name}' may not support custom dimensions.\"\n            )\n\n        logger.info(\n            f\"Successfully generated {len(embeddings)} embeddings \"\n            f\"(model: {model_name}, dimensions: {actual_dims})\"\n        )\n","sourceCodeStart":340,"sourceCodeEnd":376,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/services/embedding/adapters/openai_compatible.py#L340-L376","documentation":"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.","triggerScenarios":"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.","commonSituations":"Calling embed() with an empty texts list; gateway returning 200/empty-data on overload; provider silently dropping malformed inputs.","solutions":["Check that request.texts is non-empty before calling embed","Inspect the raw response body (attach logging) to see what the provider returned for the same input","If the gateway consistently returns empty data for valid input, report/switch — it is a provider-side bug","Retry once: transient empty responses do occur on overloaded proxies"],"exampleFix":"# before\nresp = await adapter.embed(EmbeddingRequest(texts=[]))\n# after\nif not texts:\n    return empty_response\nresp = await adapter.embed(EmbeddingRequest(texts=texts))","handlingStrategy":"validation","validationCode":"if not request.texts and not request.contents:\n    return EmbeddingResponse(embeddings=[], model=request.model or \"\", dimensions=0)\n# drop empty strings that some gateways choke on\nrequest.texts = [t for t in request.texts if t and t.strip()]","typeGuard":"null","tryCatchPattern":"try:\n    resp = await adapter.embed(req)\nexcept ValueError as e:\n    if \"no vectors were found\" in str(e):\n        resp = await adapter.embed(req)  # one retry; transient on overloaded proxies\n        if not resp.embeddings:\n            raise\n    raise","preventionTips":["Never call embed() with an empty texts list","Filter blank strings out of batches before embedding"],"tags":["empty-response","embeddings","validation"],"backgroundTag":"empty-api-response-body","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}