FoundationAgents/MetaGPT · error · ValueError
get_embedding failed
Error message
get_embedding failed
What it means
In the Stanford Town module, get_embedding calls OpenAI embeddings and retries 3 times (5s apart) on any exception; if all retries fail and no embedding was ever produced, it raises ValueError('get_embedding failed'). The per-attempt exceptions are only logged at info level, so the raise itself hides the root cause (bad API key, wrong model, network).
Source
Thrown at metagpt/ext/stanford_town/utils/utils.py:64
analysis_list += [row]
return analysis_list[0], analysis_list[1:]
def get_embedding(text, model: str = "text-embedding-ada-002"):
text = text.replace("\n", " ")
embedding = None
if not text:
text = "this is blank"
for idx in range(3):
try:
embedding = (
OpenAI(api_key=config.llm.api_key).embeddings.create(input=[text], model=model).data[0].embedding
)
except Exception as exp:
logger.info(f"get_embedding failed, exp: {exp}, will retry.")
time.sleep(5)
if not embedding:
raise ValueError("get_embedding failed")
return embedding
def extract_first_json_dict(data_str: str) -> Union[None, dict]:
# Find the first occurrence of a JSON object within the string
start_idx = data_str.find("{")
end_idx = data_str.find("}", start_idx) + 1
# Check if both start and end indices were found
if start_idx == -1 or end_idx == 0:
return None
# Extract the first JSON dictionary
json_str = data_str[start_idx:end_idx]
try:
# Attempt to parse the JSON data
json_dict = json.loads(json_str)View on GitHub (pinned to 11cdf466d0)
Solutions
- Enable info logs (or add logging of exp) to see the actual per-attempt exception before the final raise.
- Verify config.llm.api_key is set and valid, and that the embedding model name is one your key can access.
- Check network/proxy connectivity to the OpenAI embeddings endpoint.
- For rate limits, slow down simulation or increase retry backoff.
Example fix
// before
embedding = OpenAI(api_key=config.llm.api_key).embeddings.create(input=[text], model=model).data[0].embedding
// after (surface root cause)
client = OpenAI(api_key=config.llm.api_key)
try:
embedding = client.embeddings.create(input=[text], model=model).data[0].embedding
except Exception as exp:
logger.error(f"get_embedding failed permanently: {exp}")
raise Defensive patterns
Strategy: retry
Validate before calling
from metagpt.config2 import config
def embedding_ready(model: str) -> bool:
return bool(config.llm.api_key) # cheap precondition; full check needs a live call Try / catch
from metagpt.ext.stanford_town.utils.utils import get_embedding
async def safe_embedding(text: str, model: str, attempts: int = 3):
last = None
for _ in range(attempts):
try:
return get_embedding(text, model=model)
except ValueError as e:
if "get_embedding failed" in str(e):
last = e
continue
raise
raise RuntimeError("embeddings unavailable; check api key/model/network") from last Prevention
- Fail fast at startup on missing api_key instead of after 3 silent retries.
- Turn logger level to INFO during bring-up to capture the per-attempt exception.
When it happens
Trigger: Invalid/missing OpenAI API key in config.llm.api_key; embedding model not available to the account; network/proxy blocking api.openai.com; rate limits persisting across all 3 retries.
Common situations: Running stanford_town examples without OPENAI_API_KEY configured; using a key without access to the requested embedding model; corporate proxies or offline environments; exceeding rate limits during large simulations.
Related errors
- To use OpenAIEmbedding, please ensure that config.llm.api_ty
- Missing fields: {missing_fields}
- 'openai.proxy' must be specified as either a string URL or a
- Headers must be a dictionary
- Request timed out
AI-assisted analysis of FoundationAgents/MetaGPT@11cdf466d0 (2026-08-14).
Data as JSON: /api/errors/3136b9f7a98472c7.
Report an issue: GitHub.