HKUDS/Vibe-Trading · error · ValueError
weights name symbols not in the basket: {sorted(unknown)}
Error message
weights name symbols not in the basket: {sorted(unknown)} What it means
When weights is a Mapping, _parse_weights requires its keys to be exactly the basket: keys not present in symbols raise 'weights name symbols not in the basket' with the sorted unknown names (missing keys raise a separate error).
Source
Thrown at agent/src/tools/portfolio_risk_tool.py:142
"start_date": start_date,
"end_date": end_date,
"interval": interval,
"source": source,
"unresolved_symbols": list(unresolved or []),
},
}
return json.dumps(envelope, ensure_ascii=False, indent=2, allow_nan=False)
# ------------------------------------------------------------------
@staticmethod
def _parse_weights(raw: Any, symbols: list[str]) -> dict[str, float]:
if raw is None:
return {sym: 1.0 / len(symbols) for sym in symbols}
if not isinstance(raw, Mapping):
raise ValueError("weights must be an object mapping symbol → number")
unknown = [sym for sym in raw if sym not in symbols]
if unknown:
raise ValueError(f"weights name symbols not in the basket: {sorted(unknown)}")
missing = [sym for sym in symbols if sym not in raw]
if missing:
raise ValueError(f"weights missing basket symbols: {sorted(missing)}")
return {sym: raw[sym] for sym in symbols}
@staticmethod
def _parse_dates(start_raw: Any, end_raw: Any) -> tuple[str, str]:
end = (
datetime.strptime(end_raw, "%Y-%m-%d").date()
if isinstance(end_raw, str) and end_raw
else datetime.now(timezone.utc).date()
)
start = (
datetime.strptime(start_raw, "%Y-%m-%d").date()
if isinstance(start_raw, str) and start_raw
else end - timedelta(days=_DEFAULT_LOOKBACK_DAYS)
)
if start >= end:View on GitHub (pinned to 80ffdda44c)
Solutions
- Make weights keys exactly match the symbols list (after trimming)
- Rebuild weights from symbols: dict(zip(symbols, itertools.repeat(1/len(symbols)))) or similar
- Normalize ticker formatting (case, dot/dash share classes) between both arguments
Example fix
# before
execute(symbols=["AAPL","MSFT"], weights={"AAPL": 0.5, "TSLA": 0.5})
# after
execute(symbols=["AAPL","MSFT"], weights={"AAPL": 0.5, "MSFT": 0.5}) Defensive patterns
Strategy: validation
Validate before calling
symbols = [s.strip() for s in symbols]
weights = {k.strip(): v for k, v in weights.items()}
unknown = sorted(set(weights) - set(symbols))
missing = sorted(set(symbols) - set(weights))
assert not unknown and not missing Type guard
def weights_match_basket(w: Mapping[str, float], symbols: list[str]) -> bool:
s = {x.strip() for x in symbols}
return {k.strip() for k in w} == s Try / catch
try:
out = tool.execute(symbols=symbols, weights=weights)
except ValueError as e:
if "not in the basket" in str(e):
weights = {k: v for k, v in weights.items() if k in symbols}
weights.update({s: 0.0 for s in symbols if s not in weights})
out = tool.execute(symbols=symbols, weights=weights) Prevention
- Generate weights from the symbols list itself
- Normalize ticker formatting (case, dash/dot) on both sides
- Regenerate weight dicts whenever the basket changes
When it happens
Trigger: weights={"AAPL": 0.5, "TSLA": 0.5} when symbols=["AAPL","MSFT"] — TSLA is unknown.
Common situations: Editing the basket without updating weights, case/ticker mismatches (BRK.B vs BRK-B), or stale weight dicts from previous runs.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- weights must be an object mapping symbol → number
- weights missing basket symbols: {sorted(missing)}
- {model}: capital-structure weights must be non-negative, got
- {model}: capital-structure weights must sum to 1 (within {_R
- symbols must be a non-empty list of strings
AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28).
Data as JSON: /api/errors/1b578bbee91661fd.
Report an issue: GitHub.