oc_chat
Loading...
Searching...
No Matches
models.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3# providers/ollama/models.py
4
5"""
6Ollama provider model registry.
7
8Purpose
9-------
10:data:`MODELS` is the curated registry of well-known local models with
11their capabilities. Live models discovered via ``/api/tags`` that are
12not in this registry get :meth:`OllamaProvider.default_caps` instead
13(permissive local defaults).
14
15:data:`TIER_MAP` maps semantic tiers to model ids used by
16:meth:`OllamaProvider.tier`.
17
18Responsibilities
19----------------
20- :data:`MODELS` — ``dict[str, ModelCaps]`` for frequently-used local
21 models across the llama, qwen, deepseek-r1, gemma, phi, and mistral
22 families.
23- :data:`TIER_MAP` — semantic-tier lookup.
24
25Diagnostics
26-----------
27Domain: OC_CHAT.CLIENT
28Levels:
29 L2 — lifecycle events
30 L3 — semantic details
31 L4 — deep tracing
32
33Contracts
34---------
35- All ``TIER_MAP`` values must be valid keys in ``MODELS``.
36- Context windows reflect the *configured* Ollama defaults; actual
37 context is capped by available VRAM and Ollama's ``num_ctx`` setting.
38
39Dependencies
40------------
41- option_c_agent_contracts (ModelCaps)
42- oc_diagnostics (structured debug logging via _dbg)
43"""
44from __future__ import annotations
45
46from oc_diagnostics import _dbg
47
48from option_c_agent_contracts import ModelCaps
49
50_dbg("OC_CHAT.CLIENT", "module", "loaded", 4)
51
52MODELS: dict[str, ModelCaps] = {
53 # llama family
54 "llama3.2": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=131_072),
55 "llama3.2:1b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=131_072),
56 "llama3.2:3b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=131_072),
57 "llama3.1": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=131_072),
58 "llama3.1:8b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=131_072),
59 "llama3.1:70b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=131_072),
60 # qwen family
61 "qwen2.5": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
62 "qwen2.5:7b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
63 "qwen2.5:14b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
64 "qwen2.5:32b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
65 "qwen2.5-coder:7b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
66 # deepseek-r1 local (reasoning, no tools in ollama)
67 "deepseek-r1": ModelCaps(supports_thinking=False, supports_reasoning=True, supports_tools=False, max_context_tokens=65_536),
68 "deepseek-r1:1.5b": ModelCaps(supports_thinking=False, supports_reasoning=True, supports_tools=False, max_context_tokens=65_536),
69 "deepseek-r1:7b": ModelCaps(supports_thinking=False, supports_reasoning=True, supports_tools=False, max_context_tokens=65_536),
70 "deepseek-r1:8b": ModelCaps(supports_thinking=False, supports_reasoning=True, supports_tools=False, max_context_tokens=65_536),
71 "deepseek-r1:14b": ModelCaps(supports_thinking=False, supports_reasoning=True, supports_tools=False, max_context_tokens=65_536),
72 # gemma family
73 "gemma3": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=False, max_context_tokens=8_192),
74 "gemma3:4b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=False, max_context_tokens=8_192),
75 "gemma3:9b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=False, max_context_tokens=8_192),
76 "gemma3:27b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=False, max_context_tokens=8_192),
77 # phi family
78 "phi4": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=16_384),
79 "phi4:14b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=16_384),
80 # mistral family
81 "mistral": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
82 "mistral:7b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
83 "codestral": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
84 "codestral:22b": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=True, max_context_tokens=32_768),
85 # nomic embed (not a chat model — listed for /models display)
86 "nomic-embed-text": ModelCaps(supports_thinking=False, supports_reasoning=False, supports_tools=False, max_context_tokens=8_192),
87}
88
89TIER_MAP: dict[str, str] = {
90 "default": "llama3.2",
91 "cheap": "llama3.2",
92 "reasoning": "deepseek-r1:8b",
93 "summary": "llama3.2",
94}
95
96__all__ = ["MODELS", "TIER_MAP"]