mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-07-30 02:42:16 +00:00
259 lines
12 KiB
Markdown
259 lines
12 KiB
Markdown
# Intelligence Primitive
|
|
|
|
The Intelligence primitive represents **the model** — its identity, weights, quantization format, fallback chain, and the catalog of well-known models with detailed metadata. It no longer contains routing logic; query analysis and model selection have moved to the [Learning primitive](learning.md).
|
|
|
|
---
|
|
|
|
## Purpose
|
|
|
|
The Intelligence primitive answers a single question: *what is the model?* It maintains a catalog of known models with metadata (parameter count, context length, VRAM requirements, supported engines) and provides helpers for registering built-in models and merging models discovered from running engines at runtime.
|
|
|
|
The primitive provides three key capabilities:
|
|
|
|
1. **Model catalog** -- a registry of well-known models with metadata (parameter count, context length, VRAM requirements, supported engines)
|
|
2. **Auto-discovery** -- merging models discovered from running engines into the catalog
|
|
3. **Model configuration** -- `IntelligenceConfig` captures the local model's identity, weight paths, quantization, and preferred engine
|
|
|
|
!!! info "Routing has moved"
|
|
Query analysis (`build_routing_context`) and model selection (`HeuristicRouter`, `RouterPolicy` ABC) now live in the [Learning primitive](learning.md). Backward-compatible re-exports remain in `intelligence/_stubs.py` and `intelligence/router.py` so existing code continues to work.
|
|
|
|
---
|
|
|
|
## ModelSpec
|
|
|
|
Every model in the system is described by a `ModelSpec` dataclass, defined in `core/types.py`:
|
|
|
|
```python
|
|
@dataclass(slots=True)
|
|
class ModelSpec:
|
|
model_id: str # Unique identifier (e.g., "qwen3:8b")
|
|
name: str # Human-readable name
|
|
parameter_count_b: float # Total parameters in billions
|
|
context_length: int # Maximum context window (tokens)
|
|
active_parameter_count_b: Optional[float] # MoE active params (None for dense)
|
|
quantization: Quantization # Quantization format (none, fp8, int4, etc.)
|
|
min_vram_gb: float # Minimum VRAM required
|
|
supported_engines: Sequence[str] # Which engines can run this model
|
|
provider: str # Model provider (e.g., "alibaba", "meta")
|
|
requires_api_key: bool # Whether cloud API key is needed
|
|
metadata: Dict[str, Any] # Additional metadata (pricing, architecture)
|
|
```
|
|
|
|
Models are registered in the `ModelRegistry`:
|
|
|
|
```python
|
|
from openjarvis.core.registry import ModelRegistry
|
|
|
|
# Register a model
|
|
ModelRegistry.register_value("qwen3:8b", ModelSpec(
|
|
model_id="qwen3:8b",
|
|
name="Qwen3 8B",
|
|
parameter_count_b=8.2,
|
|
context_length=32768,
|
|
supported_engines=("vllm", "ollama", "llamacpp", "sglang"),
|
|
provider="alibaba",
|
|
))
|
|
```
|
|
|
|
---
|
|
|
|
## Model Catalog
|
|
|
|
The built-in model catalog is defined in `intelligence/model_catalog.py` as the `BUILTIN_MODELS` list. It includes models across three categories:
|
|
|
|
### Local Models -- Dense
|
|
|
|
| Model ID | Name | Parameters | Context | Supported Engines |
|
|
|----------|------|-----------|---------|-------------------|
|
|
| `qwen3:8b` | Qwen3 8B | 8.2B | 32K | vLLM, Ollama, llama.cpp, SGLang |
|
|
| `qwen3:32b` | Qwen3 32B | 32B | 32K | Ollama, vLLM |
|
|
| `llama3.3:70b` | Llama 3.3 70B | 70B | 128K | Ollama, vLLM |
|
|
| `llama3.2:3b` | Llama 3.2 3B | 3B | 128K | Ollama, vLLM, llama.cpp |
|
|
| `deepseek-coder-v2:16b` | DeepSeek Coder V2 16B | 16B | 128K | Ollama, vLLM |
|
|
| `mistral:7b` | Mistral 7B | 7B | 32K | Ollama, vLLM, llama.cpp |
|
|
|
|
### Local Models -- Mixture of Experts (MoE)
|
|
|
|
| Model ID | Name | Total / Active Params | Context | Min VRAM |
|
|
|----------|------|----------------------|---------|----------|
|
|
| `gpt-oss:120b` | GPT-OSS 120B | 117B / 5.1B | 128K | 12 GB |
|
|
| `glm-4.7-flash` | GLM 4.7 Flash | 30B / 3B | 128K | 8 GB |
|
|
| `trinity-mini` | Trinity Mini | 26B / 3B | 128K | 8 GB |
|
|
|
|
### Cloud Models
|
|
|
|
| Model ID | Provider | Context | Pricing (input/output per 1M tokens) |
|
|
|----------|----------|---------|--------------------------------------|
|
|
| `gpt-4o` | OpenAI | 128K | $2.50 / $10.00 |
|
|
| `gpt-4o-mini` | OpenAI | 128K | $0.15 / $0.60 |
|
|
| `gpt-5-mini` | OpenAI | 400K | $0.25 / $2.00 |
|
|
| `claude-sonnet-4-20250514` | Anthropic | 200K | $3.00 / $15.00 |
|
|
| `claude-opus-4-20250514` | Anthropic | 200K | $15.00 / $75.00 |
|
|
| `claude-opus-4-6` | Anthropic | 200K | $5.00 / $25.00 |
|
|
| `gemini-2.5-pro` | Google | 1M | $1.25 / $10.00 |
|
|
| `gemini-2.5-flash` | Google | 1M | $0.30 / $2.50 |
|
|
|
|
### Registering Built-in Models
|
|
|
|
The `register_builtin_models()` function populates the `ModelRegistry` with all built-in models. It skips models that are already registered, making it safe to call multiple times:
|
|
|
|
```python
|
|
from openjarvis.intelligence import register_builtin_models
|
|
|
|
register_builtin_models()
|
|
# All BUILTIN_MODELS are now in ModelRegistry
|
|
```
|
|
|
|
---
|
|
|
|
## Auto-Discovery: Merging Runtime Models
|
|
|
|
When engines are discovered at runtime, they report models that may not be in the built-in catalog. The `merge_discovered_models()` function creates minimal `ModelSpec` entries for these:
|
|
|
|
```python
|
|
from openjarvis.intelligence import merge_discovered_models
|
|
|
|
# Models reported by Ollama that aren't in the catalog
|
|
merge_discovered_models("ollama", ["phi3:3.8b", "codellama:7b"])
|
|
```
|
|
|
|
For each model ID not already in the registry, a `ModelSpec` is created with the model ID as both the `model_id` and `name`, with zero-value defaults for unknown fields. This ensures the routing system can still select from all available models, even ones it has no metadata for.
|
|
|
|
---
|
|
|
|
## IntelligenceConfig
|
|
|
|
The `IntelligenceConfig` dataclass (in `core/config.py`) captures the full identity of the model the system is configured to use, as well as the default sampling parameters for generation:
|
|
|
|
```python
|
|
@dataclass(slots=True)
|
|
class IntelligenceConfig:
|
|
"""The model — identity, paths, quantization, fallback chain, and generation defaults."""
|
|
|
|
default_model: str = "" # Primary model key (e.g., "qwen3:8b")
|
|
fallback_model: str = "" # Fallback when default is unavailable
|
|
model_path: str = "" # Local weights (HF repo, GGUF file, etc.)
|
|
checkpoint_path: str = "" # Checkpoint/adapter path (e.g., LoRA)
|
|
quantization: str = "none" # none, fp8, int8, int4, gguf_q4, gguf_q8
|
|
preferred_engine: str = "" # Override engine for this model (e.g., "vllm")
|
|
provider: str = "" # local, openai, anthropic, google
|
|
# Generation defaults (overridable per-call)
|
|
temperature: float = 0.7
|
|
max_tokens: int = 1024
|
|
top_p: float = 0.9
|
|
top_k: int = 40
|
|
repetition_penalty: float = 1.0
|
|
stop_sequences: str = "" # Comma-separated stop strings
|
|
```
|
|
|
|
### Model Identity Fields
|
|
|
|
| Field | Type | Default | Description |
|
|
|-------|------|---------|-------------|
|
|
| `default_model` | `str` | `""` | Primary model registry key. Resolved at startup; overrides any engine default. |
|
|
| `fallback_model` | `str` | `""` | Used when the default model is not available on any running engine. |
|
|
| `model_path` | `str` | `""` | Path or HuggingFace repo ID for local weights (e.g., `"./models/qwen3-8b.gguf"` or `"Qwen/Qwen3-8B"`). |
|
|
| `checkpoint_path` | `str` | `""` | Path to a fine-tuned checkpoint or LoRA adapter directory. |
|
|
| `quantization` | `str` | `"none"` | Quantization format. Accepted values: `none`, `fp8`, `int8`, `int4`, `gguf_q4`, `gguf_q8`. |
|
|
| `preferred_engine` | `str` | `""` | When set, `SystemBuilder`, `sdk.py`, and `cli/ask.py` use this engine key instead of `config.engine.default`. |
|
|
| `provider` | `str` | `""` | Model provider hint: `local`, `openai`, `anthropic`, `google`. Used by the Cloud engine backend to route API calls. |
|
|
|
|
### Generation Default Fields
|
|
|
|
These fields set the default sampling parameters for every inference call. Individual calls can override them by passing keyword arguments to `engine.generate()`.
|
|
|
|
| Field | Type | Default | Description |
|
|
|-------|------|---------|-------------|
|
|
| `temperature` | `float` | `0.7` | Sampling temperature. Lower values produce more deterministic output; higher values increase diversity. |
|
|
| `max_tokens` | `int` | `1024` | Maximum number of tokens to generate per call. |
|
|
| `top_p` | `float` | `0.9` | Nucleus sampling probability mass. At each step, only tokens comprising the top-p probability mass are considered. |
|
|
| `top_k` | `int` | `40` | Top-k sampling: only consider the top-k most likely tokens at each step. |
|
|
| `repetition_penalty` | `float` | `1.0` | Penalize repeated token sequences. Values greater than 1.0 reduce repetition. |
|
|
| `stop_sequences` | `str` | `""` | Comma-separated stop strings. Generation halts when any stop string appears in the output. |
|
|
|
|
!!! note "Moved from Agent"
|
|
Generation parameters (`temperature`, `max_tokens`) previously lived under `[agent]` in the config file. They now live under `[intelligence]`. Old configs with these fields under `[agent]` are automatically migrated at load time. See the [configuration migration guide](../getting-started/configuration.md#migration-guide) for details.
|
|
|
|
### TOML Configuration
|
|
|
|
```toml
|
|
[intelligence]
|
|
default_model = "qwen3:8b"
|
|
fallback_model = "llama3.2:3b"
|
|
temperature = 0.7
|
|
max_tokens = 1024
|
|
# top_p = 0.9
|
|
# top_k = 40
|
|
# repetition_penalty = 1.0
|
|
# stop_sequences = ""
|
|
|
|
# Local weight overrides (optional)
|
|
# model_path = "./models/qwen3-8b-instruct.gguf"
|
|
# checkpoint_path = "./checkpoints/my-lora"
|
|
# quantization = "gguf_q4"
|
|
|
|
# Engine selection for this model (takes priority over [engine].default)
|
|
# preferred_engine = "vllm"
|
|
|
|
# Provider for cloud models
|
|
# provider = "openai"
|
|
```
|
|
|
|
### Engine Selection Priority
|
|
|
|
When resolving which engine to use, `SystemBuilder`, `sdk.py`, and `cli/ask.py` check `config.intelligence.preferred_engine` before `config.engine.default`:
|
|
|
|
```
|
|
1. Explicit --engine CLI flag or engine_key= SDK parameter
|
|
2. config.intelligence.preferred_engine ← new field
|
|
3. config.engine.default
|
|
4. First healthy engine discovered at runtime
|
|
```
|
|
|
|
This lets you pin a specific model to a specific engine without changing the global engine default. For example, a GGUF quantized model can be pinned to `llamacpp` while the global default remains `ollama`:
|
|
|
|
```toml
|
|
[engine]
|
|
default = "ollama"
|
|
|
|
[intelligence]
|
|
default_model = "llama3.2:3b"
|
|
model_path = "./models/llama-3.2-3b.Q4_K_M.gguf"
|
|
quantization = "gguf_q4"
|
|
preferred_engine = "llamacpp"
|
|
```
|
|
|
|
---
|
|
|
|
## Public API
|
|
|
|
`intelligence/__init__.py` exports exactly three names:
|
|
|
|
```python
|
|
from openjarvis.intelligence import (
|
|
BUILTIN_MODELS, # List[ModelSpec] — the full built-in catalog
|
|
merge_discovered_models, # (engine_key, model_ids) -> None
|
|
register_builtin_models, # () -> None
|
|
)
|
|
```
|
|
|
|
### Backward-Compatibility Shims
|
|
|
|
The following names are still importable from `openjarvis.intelligence` via shim modules, but their canonical locations have moved:
|
|
|
|
| Name | Old location | Canonical location |
|
|
|------|-------------|-------------------|
|
|
| `RouterPolicy` | `intelligence/_stubs.py` | `learning/_stubs.py` |
|
|
| `QueryAnalyzer` | `intelligence/_stubs.py` | `learning/_stubs.py` |
|
|
| `HeuristicRouter` | `intelligence/router.py` | `learning/router.py` |
|
|
| `build_routing_context` | `intelligence/router.py` | `learning/router.py` |
|
|
| `DefaultQueryAnalyzer` | `intelligence/router.py` | `learning/router.py` |
|
|
|
|
New code should import from the canonical `learning.*` locations. The shims in `intelligence/_stubs.py` and `intelligence/router.py` are retained for backward compatibility only.
|
|
|
|
---
|
|
|
|
## Integration with Learning
|
|
|
|
The Learning primitive consumes the model catalog to make routing decisions. The `HeuristicRouter` and `TraceDrivenPolicy` both read `ModelRegistry` to compare model sizes when selecting between candidates. See the [Learning & Traces](learning.md) documentation for full details on routing policies, the `RouterPolicy` ABC, and the trace-driven feedback loop.
|