@@ -235,6 +235,17 @@ def requires_api_key(provider: str) -> bool:
235235 return provider .lower () not in _PROVIDERS_WITHOUT_API_KEY
236236
237237
238+ def _validate_ollama_num_ctx (value : Any ) -> int | None :
239+ """Validate a native Ollama context-window override."""
240+ if value is None :
241+ return None
242+ if isinstance (value , bool ) or not isinstance (value , int ):
243+ raise ValueError (f"ollama_num_ctx must be a positive integer, got { value !r} " )
244+ if value < 1 :
245+ raise ValueError (f"ollama_num_ctx must be >= 1, got { value } " )
246+ return value
247+
248+
238249def create_llm_provider (
239250 provider : str ,
240251 api_key : str ,
@@ -254,6 +265,7 @@ def create_llm_provider(
254265 litellmrouter_config : dict [str , Any ] | None = None ,
255266 gemini_service_tier : str | None = None ,
256267 timeout : float | None = None ,
268+ ollama_num_ctx : int | None = None ,
257269) -> Any : # Returns LLMInterface
258270 """
259271 Factory function to create the appropriate LLM provider implementation.
@@ -268,6 +280,8 @@ def create_llm_provider(
268280 openai_service_tier: OpenAI service tier (for OpenAI provider) - None (default) or "flex" (50% cheaper).
269281 bedrock_service_tier: Bedrock service tier (for Bedrock provider) - None (default), "flex", "priority", or "reserved".
270282 gemini_service_tier: Gemini service tier (for Gemini provider) - None (default) or "flex" (50% cheaper).
283+ ollama_num_ctx: Native Ollama context window override. None lets Ollama use the
284+ model/server default.
271285 extra_body: Extra request-body params merged into the provider's native
272286 call. Threaded into OpenAI-compatible, Fireworks, Anthropic, Gemini/
273287 VertexAI and LiteLLM providers (each merges them in its own parameter
@@ -291,6 +305,8 @@ def create_llm_provider(
291305 Returns:
292306 LLMInterface implementation for the specified provider.
293307 """
308+ ollama_num_ctx = _validate_ollama_num_ctx (ollama_num_ctx )
309+
294310 from .providers import (
295311 AnthropicLLM ,
296312 ClaudeCodeLLM ,
@@ -494,6 +510,7 @@ def create_llm_provider(
494510 groq_service_tier = groq_service_tier ,
495511 openai_service_tier = openai_service_tier ,
496512 extra_body = extra_body ,
513+ ollama_num_ctx = ollama_num_ctx ,
497514 timeout = timeout ,
498515 )
499516
@@ -531,6 +548,7 @@ def __init__(
531548 max_retries : int | None = None ,
532549 initial_backoff : float | None = None ,
533550 max_backoff : float | None = None ,
551+ ollama_num_ctx : int | None = None ,
534552 ):
535553 """
536554 Initialize LLM provider.
@@ -545,6 +563,8 @@ def __init__(
545563 openai_service_tier: OpenAI service tier (None or "flex") - from config.
546564 bedrock_service_tier: Bedrock service tier (None, "flex", "priority", "reserved") - from config.
547565 gemini_service_tier: Gemini service tier (None or "flex") - from config.
566+ ollama_num_ctx: Native Ollama context window override. ``None`` lets Ollama
567+ use the model/server default.
548568 gemini_safety_settings: Safety settings for Gemini/VertexAI providers.
549569 extra_body: Extra request-body params merged into the provider's native call
550570 (OpenAI-compatible, Fireworks, Anthropic, Gemini/VertexAI, LiteLLM).
@@ -598,6 +618,7 @@ def __init__(
598618 self .openai_service_tier = openai_service_tier
599619 self .bedrock_service_tier = bedrock_service_tier
600620 self .gemini_service_tier = gemini_service_tier
621+ self .ollama_num_ctx = _validate_ollama_num_ctx (ollama_num_ctx )
601622 # Gemini safety settings (instance default; can be overridden per-request via context var)
602623 self .gemini_safety_settings = gemini_safety_settings
603624 # Gemini prompt caching: when True, retain extraction (and any future
@@ -742,6 +763,7 @@ def __init__(
742763 gemini_safety_settings = self .gemini_safety_settings ,
743764 prompt_cache_enabled = self .prompt_cache_enabled ,
744765 litellmrouter_config = router_config ,
766+ ollama_num_ctx = self .ollama_num_ctx ,
745767 timeout = self .timeout ,
746768 )
747769
@@ -1260,6 +1282,7 @@ def from_env(cls) -> "LLMProvider":
12601282 ENV_LLM_GROQ_SERVICE_TIER ,
12611283 ENV_LLM_LITELLMROUTER_CONFIG ,
12621284 ENV_LLM_MODEL ,
1285+ ENV_LLM_OLLAMA_NUM_CTX ,
12631286 ENV_LLM_OPENAI_SERVICE_TIER ,
12641287 ENV_LLM_PROMPT_CACHE_ENABLED ,
12651288 ENV_LLM_PROVIDER ,
@@ -1270,6 +1293,7 @@ def from_env(cls) -> "LLMProvider":
12701293 ENV_LLM_VERTEXAI_SERVICE_ACCOUNT_KEY ,
12711294 _get_default_model_for_provider ,
12721295 _parse_llm_router_config ,
1296+ _parse_optional_positive_int ,
12731297 parse_gemini_service_tier ,
12741298 )
12751299
@@ -1314,6 +1338,7 @@ def from_env(cls) -> "LLMProvider":
13141338 ),
13151339 gemini_safety_settings = json .loads (os .getenv (ENV_LLM_GEMINI_SAFETY_SETTINGS , "null" )),
13161340 prompt_cache_enabled = prompt_cache_enabled ,
1341+ ollama_num_ctx = _parse_optional_positive_int (ENV_LLM_OLLAMA_NUM_CTX , os .getenv (ENV_LLM_OLLAMA_NUM_CTX )),
13171342 litellmrouter_config = _parse_llm_router_config (ENV_LLM_LITELLMROUTER_CONFIG ),
13181343 vertexai_project_id = os .getenv (ENV_LLM_VERTEXAI_PROJECT_ID ) or None ,
13191344 vertexai_region = os .getenv (ENV_LLM_VERTEXAI_REGION ) or None ,
0 commit comments