From ae247d375fc76421b246c0c48020dbced94d2e8d Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Fri, 10 Jul 2026 15:04:00 -0500 Subject: [PATCH] Make Ollama context window configurable via num_ctx Ollama defaults to a small context window (2048 tokens), which silently truncates long prompts and image inputs. Expose it as a configurable num_ctx passed in the request options for both the generate and chat endpoints. The value can be set per-instance (OllamaModel(num_ctx=...)) or via the OLLAMA_NUM_CTX environment variable, defaulting to 8192. Co-Authored-By: Claude Opus 4.8 --- lars/nepho/config.py | 3 +++ lars/nepho/models/ollama_model.py | 11 +++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lars/nepho/config.py b/lars/nepho/config.py index 210c013..b07e1be 100644 --- a/lars/nepho/config.py +++ b/lars/nepho/config.py @@ -12,6 +12,9 @@ class Config: # Ollama Configuration OLLAMA_BASE_URL: str = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434") + # Context window size (tokens) passed to Ollama as num_ctx. Ollama's + # default is small (2048), which silently truncates long prompts/images. + OLLAMA_NUM_CTX: int = int(os.getenv("OLLAMA_NUM_CTX", "8192")) # Default models DEFAULT_GPT_MODEL: str = os.getenv("DEFAULT_GPT_MODEL", "gpt-4-vision-preview") diff --git a/lars/nepho/models/ollama_model.py b/lars/nepho/models/ollama_model.py index 8e1f799..bdbea2d 100644 --- a/lars/nepho/models/ollama_model.py +++ b/lars/nepho/models/ollama_model.py @@ -8,11 +8,12 @@ class OllamaModel(BaseModel): """Ollama model implementation for local models.""" - def __init__(self, model_name: str = None, base_url: str = None): + def __init__(self, model_name: str = None, base_url: str = None, num_ctx: int = None): model_name = model_name or config.DEFAULT_OLLAMA_MODEL super().__init__(model_name) - + self.base_url = base_url or config.OLLAMA_BASE_URL + self.num_ctx = num_ctx or config.OLLAMA_NUM_CTX self.api_url = f"{self.base_url}/api/generate" self.chat_url = f"{self.base_url}/api/chat" @@ -76,7 +77,8 @@ async def chat(self, prompt: str, images: Optional[List[str]] = None) -> str: "model": self.model_name, "prompt": prompt, "images": images_data, - "stream": False + "stream": False, + "options": {"num_ctx": self.num_ctx} } # Use generate endpoint for vision models @@ -88,7 +90,8 @@ async def chat(self, prompt: str, images: Optional[List[str]] = None) -> str: "messages": [ {"role": "user", "content": prompt} ], - "stream": False + "stream": False, + "options": {"num_ctx": self.num_ctx} } url = self.chat_url