1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Provider System
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Overview
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon supports multiple AI providers through a unified abstraction layer. Default models favor cost-effective options (Haiku, GPT-4o-mini, Gemini Flash) for routine tasks, with more capable models available when needed.
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Supported providers
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Provider | Chat | Vision | Transcription | Env Variable |
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|----------|------|--------|--------------|--------------|
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| OpenAI | GPT-4o-mini, GPT-4o | GPT-4o-mini, GPT-4o | Whisper-1 | `OPENAI_API_KEY` |
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Anthropic | Claude Haiku, Sonnet, Opus | Claude Haiku, Sonnet, Opus | — | `ANTHROPIC_API_KEY` |
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Google Gemini | Gemini Flash, Pro | Gemini Flash, Pro | Gemini Flash | `GEMINI_API_KEY` |
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Azure OpenAI | GPT-4o-mini, GPT-4o | GPT-4o-mini, GPT-4o | Whisper-1 | `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_ENDPOINT` |
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Together AI | Llama, Mixtral, etc. | Llava | — | `TOGETHER_API_KEY` |
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Fireworks AI | Llama, Mixtral, etc. | Llava | — | `FIREWORKS_API_KEY` |
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Cerebras | Llama (fast inference) | — | — | `CEREBRAS_API_KEY` |
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| xAI | Grok | Grok | — | `XAI_API_KEY` |
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Ollama (local) | Any installed model | llava, moondream, etc. | — (use local Whisper) | `OLLAMA_HOST` |
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Default models
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon defaults to cheap, fast models for cost efficiency:
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Task | Default model |
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|------|--------------|
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Vision (diagrams) | Gemini Flash |
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Chat (analysis) | Claude Haiku |
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Transcription | Local Whisper (fallback: Whisper-1) |
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Use `--vision-model` and `--chat-model` to override with more capable models when needed (e.g., `--chat-model claude-sonnet-4-20250514` for complex analysis).
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Ollama (offline mode)
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[Ollama](https://ollama.com) enables fully offline operation with no API keys required. PlanOpticon connects via Ollama's OpenAI-compatible API.
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Install and start Ollama
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ollama serve
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Pull a chat model
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ollama pull llama3.2
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Pull a vision model (for diagram analysis)
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ollama pull llava
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon auto-detects Ollama when it's running. To force Ollama:
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon analyze -i video.mp4 -o ./out --provider ollama
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Configure a non-default host via `OLLAMA_HOST`:
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
export OLLAMA_HOST=http://192.168.1.100:11434
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Auto-discovery
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
On startup, `ProviderManager` checks which API keys are configured, queries each provider's API, and checks for a running Ollama server to discover available models:
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.manager import ProviderManager
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager()
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Automatically discovers models from all configured providers + Ollama
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Routing preferences
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Each task type has a default preference order (cheapest first):
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Task | Preference |
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|------|-----------|
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Vision | Gemini Flash → GPT-4o-mini → Claude Haiku → Ollama |
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Chat | Claude Haiku → GPT-4o-mini → Gemini Flash → Ollama |
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Transcription | Local Whisper → Whisper-1 → Gemini Flash |
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Ollama acts as the last-resort fallback -- if no cloud API keys are set but Ollama is running, it is used automatically.
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Manual override
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager(
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
vision_model="gpt-4o",
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
chat_model="claude-sonnet-4-20250514",
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
provider="openai", # Force a specific provider
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Use a cheap model for bulk processing
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager(
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
chat_model="claude-haiku-3-5-20241022",
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
vision_model="gemini-2.0-flash",
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Or use Ollama for fully offline processing
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager(provider="ollama")
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Use Azure OpenAI
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager(provider="azure")
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Use Together AI for open-source models
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager(provider="together", chat_model="meta-llama/Llama-3.3-70B-Instruct-Turbo")
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## BaseProvider interface
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All providers implement:
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class BaseProvider(ABC):
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def chat(messages, max_tokens, temperature) -> str
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def analyze_image(image_path, prompt, max_tokens) -> str
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def transcribe_audio(audio_path) -> dict
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def list_models() -> List[ModelInfo]
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!