tinyhumansai/openhuman · error

categories must be an array of strings

Error message

categories must be an array of strings

What it means

Optional-field type guard in parse_search_args: "categories" was provided but is not a JSON array (e.g. a comma-separated string like "general,news"). The parser only accepts an array or explicit null; any other shape fails here. The faulting input is a non-array categories value.

Source

Thrown at src/openhuman/search/tools/searxng.rs:398

        .unwrap_or_default()
}

fn parse_search_args(args: serde_json::Value) -> anyhow::Result<SearxngSearchArgs> {
    let object = args
        .as_object()
        .ok_or_else(|| anyhow::anyhow!("SearXNG arguments must be an object"))?;
    let query = object
        .get("query")
        .and_then(|value| value.as_str())
        .map(str::trim)
        .filter(|value| !value.is_empty())
        .ok_or_else(|| anyhow::anyhow!("Missing required parameter: query"))?
        .to_string();
    let categories = match object.get("categories") {
        Some(value) if value.is_null() => Vec::new(),
        Some(value) => value
            .as_array()
            .ok_or_else(|| anyhow::anyhow!("categories must be an array of strings"))?
            .iter()
            .map(|item| {
                item.as_str()
                    .map(str::to_string)
                    .ok_or_else(|| anyhow::anyhow!("categories must contain only strings"))
            })
            .collect::<anyhow::Result<Vec<_>>>()?,
        None => Vec::new(),
    };
    let language = match object.get("language") {
        Some(value) => {
            let language = value
                .as_str()
                .map(str::trim)
                .filter(|value| !value.is_empty())
                .ok_or_else(|| anyhow::anyhow!("language must be a non-empty string"))?;
            Some(language.to_string())
        }

View on GitHub (pinned to 7491200858)

Solutions

  1. Pass categories as an array of strings, e.g. ["general","news"].
  2. Omit the field or pass null to search all categories.
  3. Convert comma-separated category strings to arrays before invoking.
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at src/openhuman/search/tools/searxng.rs:398 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/69738201338e1225. Report an issue: GitHub.