{"record":{"id":"b12893ccd3c1c333","repo":"agentscope-ai/agentscope","slug":"failed-to-call-embedding-model-self-model-after","errorCode":null,"errorMessage":"Failed to call embedding model {self.model} after {self.max_retries + 1} retries.","messagePattern":"Failed to call embedding model (.+?) after (.+?) retries\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"src/agentscope/embedding/_embedding_base.py","lineNumber":354,"sourceCode":"                        \"Batch attempt %d failed for embedding model \"\n                        \"%s: %s. Retrying in %.1fs...\",\n                        attempt + 1,\n                        self.model,\n                        str(e),\n                        self.retry_delay,\n                    )\n                    await asyncio.sleep(self.retry_delay)\n                else:\n                    logger.warning(\n                        \"All %d attempt(s) failed for a batch of \"\n                        \"embedding model %s.\",\n                        self.max_retries + 1,\n                        self.model,\n                    )\n\n        if last_error is not None:\n            raise last_error\n        raise RuntimeError(\n            f\"Failed to call embedding model {self.model} after \"\n            f\"{self.max_retries + 1} retries.\",\n        )\n\n    # ------------------------------------------------------------------\n    # Abstract — subclasses implement this for a single batch\n    # ------------------------------------------------------------------\n\n    @abstractmethod\n    async def _call_api(\n        self,\n        inputs: list[Any],\n        **kwargs: Any,\n    ) -> EmbeddingResponse:\n        \"\"\"Call the underlying embedding API for a **single batch**.\n\n        Subclasses must implement this method.  The batch splitting,\n        concurrency, and retry logic are handled by :meth:`__call__`","sourceCodeStart":336,"sourceCodeEnd":372,"githubUrl":"https://github.com/agentscope-ai/agentscope/blob/e90f1c7592896cc95f6e5ee506194f533378247d/src/agentscope/embedding/_embedding_base.py#L336-L372","documentation":"Raised by EmbeddingModelBase._call_with_retry when the embedded provider call raised no exception on the final pass but also produced no usable outcome path (defensive terminal error after max_retries+1 attempts), reporting the model name and retry count.","triggerScenarios":"Exhausting all retry attempts for __call__ on an embedding model — each attempt failing (network/API errors) — after which the wrapper gives up; also reachable if retries complete without success and without a captured last_error.","commonSituations":"Sustained provider outages or rate limiting; invalid credentials causing every retry to fail; very large batches that consistently time out.","solutions":["Inspect the underlying provider error (last_error / logs) and fix credentials, quota, or batch size","Increase max_retries and use exponential backoff for flaky networks","Cache embeddings and enqueue failures for later replay instead of retrying inline forever"],"exampleFix":"# before\nvecs = await model(texts)\n# after\ntry:\n    vecs = await model(texts)\nexcept RuntimeError:\n    vecs = await replay_later(texts)  # queue and degrade gracefully","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"for attempt in range(N):\\n    try:\\n        vecs = await model(texts); break\\n    except RuntimeError as e:\\n        if \\\"after\\\" in str(e) and \\\"retries\\\" in str(e) and attempt < N - 1:\\n            await asyncio.sleep(2 ** attempt); continue\\n        raise","preventionTips":["Persist failed batches to a dead-letter queue","Tune max_retries and backoff per workload","Monitor provider health before large embedding jobs"],"tags":["embedding","retry","exhausted","api-error"],"backgroundTag":"retry-exhausted","analyzedSha":"e90f1c7592896cc95f6e5ee506194f533378247d","analyzedAt":"2026-08-28T18:24:12.087Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}