zylon-ai/private-gpt · warning · ValueError

Output is not a string, number, pd.DataFrame, or chart

Error message

Output is not a string, number, pd.DataFrame, or chart

What it means

Raised by PandasAIOutput.get_output_value() when _determine_response_type() returns None or an unknown key: the value is none of DataFrame, ChartResponse, str, or a number type. _determine_response_type runs the type_checks list; a miss means the analysis produced an exotic value (dict, list, None, datetime, etc.) the dispatch table does not cover.

Solutions

  1. Log repr(self.value) to identify the uncovered type.
  2. Handle dict/list by str()-ing or json-serializing before dispatch, or extend type_checks in a subclass.
  3. Prompt the model to end with an explicit DataFrame/string/number expression.
  4. Fall back to str(output) for display when get_output_value() raises.

Example fix

# before
value = output.get_output_value()  # ValueError

# after
try:
    value = output.get_output_value()
except ValueError:
    value = str(output)
Defensive patterns

Strategy: fallback

Validate before calling

SUPPORTED = (str, int, float, complex, bool)

def is_representable(output) -> bool:
    import pandas as pd
    v = output.value
    return isinstance(v, pd.DataFrame) or output.is_chart() or isinstance(v, SUPPORTED)

Type guard

def classify_output(output):
    t = output._determine_response_type()
    return t if t in {"dataframe", "chart", "string", "number"} else "other"

Try / catch

try:
    value = output.get_output_value()
except ValueError:
    value = str(output)

Prevention

When it happens

Trigger: Generated code's final value is a dict, list, tuple, None, or a numpy type not matched by the number check; execution produced no value at all so self.value is None.

Common situations: LLM returns a list of tuples or a dict of aggregates; model assigns to a variable instead of leaving a final expression so value is None; pandasai version change altering what value is propagated.

Related errors


AI-assisted analysis of zylon-ai/private-gpt@4a030776a3 (2026-08-15). Data as JSON: /api/errors/e02518fd2ec30637. Report an issue: GitHub.

Appendix: source

Thrown at private_gpt/components/tabular/pandasai_service.py:184

            if check_func():
                return type_name

        return None

    def get_raw(self) -> Any | None:
        """Get the raw output value in its appropriate format."""
        handlers: dict[str, Callable[[], Any]] = {
            "dataframe": lambda: None,
            "chart": self.get_chart,
            "string": lambda: str(self.value),
            "number": lambda: None,
        }

        response_type = self._determine_response_type()
        if response_type in handlers:
            return handlers[response_type]()

        raise ValueError("Output is not a string, number, pd.DataFrame, or chart")

    def __str__(self) -> str:
        """Convert the output to a string representation."""
        str_converters: dict[str, Callable[[], str]] = {
            "dataframe": lambda: (
                df_to_minimal_markdown(self.get_dataframe()) or "No results."
            ),
            "chart": lambda: (
                "Generated chart successfully. Plot was attached to the conversation."
                "Don't create placeholders for charts, just reply that the chart was generated."
            ),
            "string": lambda: str(self.value),
            "number": lambda: format_number(self.value),
        }

        response_type = self._determine_response_type()
        if response_type and response_type in str_converters:
            return str_converters[response_type]()

View on GitHub (pinned to 4a030776a3)