run-llama/llama_index · error · ValueError

llm must start with str 'local' or of type LLM or BaseLangua

Error message

llm must start with str 'local' or of type LLM or BaseLanguageModel

What it means

resolve_llm accepts either an LLM instance, a LangChain BaseLanguageModel, or a string — but strings are only valid in the form 'local[:<model_path>]' which triggers LlamaCPP loading. Any other string (a bare model name like 'gpt-4', a path, an arbitrary label) fails this check with a ValueError.

Source

Thrown at llama-index-core/llama_index/core/llms/utils.py:78

                "`llama-index-llms-openai` package not found, "
                "please run `pip install llama-index-llms-openai`"
            )
        except ValueError as e:
            raise ValueError(
                "\n******\n"
                "Could not load OpenAI model. "
                "If you intended to use OpenAI, please check your OPENAI_API_KEY.\n"
                "Original error:\n"
                f"{e!s}"
                "\n******"
            )

    if isinstance(llm, str):
        splits = llm.split(":", 1)
        is_local = splits[0]
        model_path = splits[1] if len(splits) > 1 else None
        if is_local != "local":
            raise ValueError(
                "llm must start with str 'local' or of type LLM or BaseLanguageModel"
            )
        try:
            from llama_index.llms.llama_cpp.llama_utils import (
                completion_to_prompt,
                messages_to_prompt,
            )  # pants: no-infer-dep

            from llama_index.llms.llama_cpp import LlamaCPP  # pants: no-infer-dep

            llm = LlamaCPP(
                model_path=model_path,
                messages_to_prompt=messages_to_prompt,
                completion_to_prompt=completion_to_prompt,
                model_kwargs={"n_gpu_layers": 1},
            )
        except ImportError:
            raise ImportError(

View on GitHub (pinned to afd0fef371)

Solutions

  1. To use OpenAI: from llama_index.llms.openai import OpenAI; Settings.llm = OpenAI(model='gpt-4o').
  2. To use a local GGUF model: pass 'local:/path/to/model.gguf' (and install llama-index-llms-llama-cpp).
  3. Pass an actual LLM/LangChainLLM instance instead of a string.

Example fix

# before
Settings.llm = "gpt-4o"  # ValueError
# after
from llama_index.llms.openai import OpenAI
Settings.llm = OpenAI(model="gpt-4o")
# local model path
Settings.llm = "local:/models/llama-2-7b.gguf"
Defensive patterns

Strategy: type-guard

Validate before calling

from llama_index.core.llms import LLM
from llama_index.core.llms.utils import BaseLanguageModel

def is_acceptable_llm_value(llm) -> bool:
    if isinstance(llm, LLM):
        return True
    if BaseLanguageModel is not None and isinstance(llm, BaseLanguageModel):
        return True
    return isinstance(llm, str) and llm.split(":", 1)[0] == "local"

Type guard

def is_local_llm_spec(value) -> bool:
    return isinstance(value, str) and value.split(":", 1)[0] == "local"

Try / catch

try:
    resolved = resolve_llm(llm_value)
except ValueError as e:
    if "must start with str 'local'" in str(e):
        raise ValueError("Pass an LLM instance or 'local:<model_path>', not a model name") from e
    raise

Prevention

When it happens

Trigger: Passing Settings.llm = 'gpt-4o' or llm='some-model-name' to a constructor that resolves LLMs; passing a filesystem path string that doesn't start with 'local:'.

Common situations: Assuming the string is a model identifier (a common expectation from other SDKs); migrating configs where llm was previously an object and got serialized to a string.

Related errors


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