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

  1. Make weights keys exactly match the symbols list (after trimming)
  2. Rebuild weights from symbols: dict(zip(symbols, itertools.repeat(1/len(symbols)))) or similar
  3. 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

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


AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28). Data as JSON: /api/errors/1b578bbee91661fd. Report an issue: GitHub.