infiniflow/ragflow · error · ValueError

Querit urls must be absolute HTTP or HTTPS URLs.

Error message

Querit urls must be absolute HTTP or HTTPS URLs.

What it means

ValueError from _validate_contents_inputs(): every entry in the urls list must parse as an absolute HTTP(S) URL — scheme exactly 'http' or 'https' AND a non-empty netloc. Scheme-relative ('//host/path'), bare hostnames ('example.com/page'), and other schemes (ftp://, file://) are rejected.

Source

Thrown at agent/tools/querit.py:378

        "format": format,
        "crawlTimeout": crawl_timeout,
        "extrasMeta": extras_meta,
    }


def _normalize_contents_urls(urls: Any) -> Any:
    if isinstance(urls, str):
        return [url.strip() for url in urls.split(",") if url.strip()]
    return urls


def _validate_contents_inputs(urls: Any, format: Any, crawl_timeout: Any, extras_meta: Any) -> None:
    if not isinstance(urls, list) or not 1 <= len(urls) <= 10 or any(not isinstance(url, str) or not url.strip() for url in urls):
        raise ValueError("Querit urls must contain between 1 and 10 non-empty strings.")
    for url in urls:
        parsed = urlparse(url)
        if parsed.scheme not in {"http", "https"} or not parsed.netloc:
            raise ValueError("Querit urls must be absolute HTTP or HTTPS URLs.")
    if format not in QUERIT_CONTENT_FORMATS:
        raise ValueError("Querit format must be text, markdown, or html.")
    if type(crawl_timeout) is not int or not 1 <= crawl_timeout <= 60:
        raise ValueError("Querit crawl_timeout must be an integer from 1 to 60.")
    if type(extras_meta) is not bool:
        raise ValueError("Querit extras_meta must be a boolean.")


def _validate_contents_response(response_data: Any) -> None:
    if not isinstance(response_data, dict):
        raise TypeError("Querit API response must be a JSON object.")
    if "results" in response_data and not isinstance(response_data["results"], list):
        raise TypeError("Querit API response field results must be an array.")
    if "statuses" in response_data and not isinstance(response_data["statuses"], list):
        raise TypeError("Querit API response field statuses must be an array.")


def _validate_search_inputs(

View on GitHub (pinned to 554fb1133a)

Solutions

  1. Prefix each URL with http:// or https:// (prefer https).
  2. Normalize before the call: if '://' not in url, prepend 'https://'.
  3. Remove ftp://, file://, mailto: entries — only http(s) is supported.
  4. Validate with urllib.parse.urlparse in your caller so bad rows are dropped or fixed before invoking the tool.

Example fix

# before
urls = ["example.com/page", "ftp://x.com/f"]

# after
from urllib.parse import urlparse
raw = ["example.com/page", "https://ok.com"]
urls = [u if urlparse(u).scheme in {"http", "https"} else "https://" + u for u in raw if not u.startswith("ftp://")]
Defensive patterns

Strategy: validation

Validate before calling

from urllib.parse import urlparse
def absolute_http_urls(urls: list[str]) -> bool:
    return all(urlparse(u).scheme in {"http", "https"} and urlparse(u).netloc for u in urls)

Type guard

def is_absolute_http_url(u: Any) -> bool:
    if not isinstance(u, str):
        return False
    p = urlparse(u)
    return p.scheme in {"http", "https"} and bool(p.netloc)

Try / catch

try:
    querit_contents._invoke(urls=urls)
except ValueError as e:
    if "absolute HTTP" in str(e):
        urls = ["https://" + u if not urlparse(u).scheme else u for u in urls]
        querit_contents._invoke(urls=urls)
    raise

Prevention

When it happens

Trigger: urls containing 'example.com/page' (no scheme), '//cdn.example.com/x' (protocol-relative), 'ftp://files.example.com/x', or a value like 'https://' with empty netloc.

Common situations: Users pasting URLs copied from browsers that strip the scheme; LLM tool-call outputs emitting bare domains; data pipelines carrying internal ftp/file URIs; trailing whitespace is fine (stripped earlier) but missing scheme is not.

Related errors


AI-assisted analysis of infiniflow/ragflow@554fb1133a (2026-08-15). Data as JSON: /api/errors/0009d52b8a84a6de. Report an issue: GitHub.