run-llama/llama_index · error · ValueError

names and results_arr must have same length.

Error message

names and results_arr must have same length.

What it means

get_eval_results_df zips names with results_arr to label each EvaluationResult; if the two lists differ in length the pairing is undefined, so the function raises ValueError('names and results_arr must have same length.') after the pandas import.

Source

Thrown at llama-index-core/llama_index/core/evaluation/notebook_utils.py:62

    names: List[str], results_arr: List[EvaluationResult], metric: Optional[str] = None
) -> Tuple[Any, Any]:
    """
    Organizes EvaluationResults into a deep dataframe and computes the mean
    score.

    result:
        result_df: pd.DataFrame representing all the evaluation results
        mean_df: pd.DataFrame of average scores groupby names
    """
    try:
        import pandas as pd
    except ImportError:
        raise ImportError(
            "pandas is required for this function. Please install it with `pip install pandas`."
        )

    if len(names) != len(results_arr):
        raise ValueError("names and results_arr must have same length.")

    qs = []
    ss = []
    fs = []
    rs = []
    cs = []
    for res in results_arr:
        qs.append(res.query)
        ss.append(res.score)
        fs.append(res.feedback)
        rs.append(res.response)
        cs.append(res.contexts)

    deep_df = pd.DataFrame(
        {
            "rag": names,
            "query": qs,
            "answer": rs,

View on GitHub (pinned to afd0fef371)

Solutions

  1. Make the lists equal length: one name per EvaluationResult entry
  2. Build them from the same source structure: for name, res in runs: names.append(name); results.append(res)
  3. Assert len(names) == len(results_arr) right before the call in test/eval scripts

Example fix

# before
names = ["gpt-4", "gpt-3.5"]
results = [r1, r2, r3]  # 3 results, 2 names
get_eval_results_df(names, results)

# after
assert len(names) == len(results)
get_eval_results_df(names, results)
Defensive patterns

Strategy: validation

Validate before calling

assert len(names) == len(results_arr), f"names({len(names)}) != results({len(results_arr)})"
result_df, mean_df = get_eval_results_df(names, results_arr)

Try / catch

try:
    result_df, mean_df = get_eval_results_df(names, results)
except ValueError as e:
    if "same length" in str(e):
        names, results = align_runs(names, results)  # your repair logic
        result_df, mean_df = get_eval_results_df(names, results)
    else:
        raise

Prevention

When it happens

Trigger: Calling get_eval_results_df(names, results_arr) with len(names) != len(results_arr), e.g. 3 evaluator names but results from only 2 runs, or a flattened results list.

Common situations: Appending a new evaluator run to names but forgetting results (or vice versa); filtering failed results out of results_arr but not names; off-by-one when manually building the lists.

Related errors


AI-assisted analysis of run-llama/llama_index@afd0fef371 (2026-08-15). Data as JSON: /api/errors/c4a30efee2446b5a. Report an issue: GitHub.