1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Providers API Reference
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
::: video_processor.providers.base
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
::: video_processor.providers.manager
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
::: video_processor.providers.discovery
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Overview
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The provider system abstracts LLM API calls behind a unified interface. It supports multiple providers (OpenAI, Anthropic, Gemini, Ollama, and OpenAI-compatible services), automatic model discovery, capability-based routing, and usage tracking.
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Key components:**
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **`BaseProvider`** -- abstract interface that all providers implement
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **`ProviderRegistry`** -- global registry mapping provider names to classes
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **`ProviderManager`** -- high-level router that picks the best provider for each task
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- **`discover_available_models()`** -- scans all configured providers for available models
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## BaseProvider (ABC)
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.base import BaseProvider
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Abstract base class that all provider implementations must subclass. Defines the four core capabilities: chat, vision, audio transcription, and model listing.
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Class attribute:**
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Attribute | Type | Description |
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `provider_name` | `str` | Identifier for this provider (e.g., `"openai"`, `"anthropic"`) |
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### chat()
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def chat(
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
messages: list[dict],
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
max_tokens: int = 4096,
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
temperature: float = 0.7,
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
model: Optional[str] = None,
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Send a chat completion request.
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Parameters:**
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `messages` | `list[dict]` | *required* | OpenAI-format message list (`role`, `content`) |
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `max_tokens` | `int` | `4096` | Maximum tokens in the response |
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `temperature` | `float` | `0.7` | Sampling temperature |
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `model` | `Optional[str]` | `None` | Override model ID |
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Returns:** `str` -- the assistant's text response.
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### analyze_image()
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def analyze_image(
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
image_bytes: bytes,
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
prompt: str,
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
max_tokens: int = 4096,
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
model: Optional[str] = None,
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Analyze an image with a text prompt using a vision-capable model.
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Parameters:**
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `image_bytes` | `bytes` | *required* | Raw image data (JPEG, PNG, etc.) |
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `prompt` | `str` | *required* | Analysis instructions |
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `max_tokens` | `int` | `4096` | Maximum tokens in the response |
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `model` | `Optional[str]` | `None` | Override model ID |
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Returns:** `str` -- the assistant's analysis text.
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### transcribe_audio()
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def transcribe_audio(
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
audio_path: str | Path,
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
language: Optional[str] = None,
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
model: Optional[str] = None,
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> dict
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Transcribe an audio file.
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Parameters:**
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `audio_path` | `str \| Path` | *required* | Path to the audio file |
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `language` | `Optional[str]` | `None` | Language hint (ISO 639-1 code) |
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `model` | `Optional[str]` | `None` | Override model ID |
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Returns:** `dict` -- transcription result with keys `text`, `segments`, `duration`, etc.
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### list_models()
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def list_models(self) -> list[ModelInfo]
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Discover available models from this provider's API.
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Returns:** `list[ModelInfo]` -- available models with capability metadata.
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## ModelInfo
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.base import ModelInfo
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pydantic model describing an available model from a provider.
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Field | Type | Default | Description |
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `id` | `str` | *required* | Model identifier (e.g., `"gpt-4o"`, `"claude-haiku-4-5-20251001"`) |
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `provider` | `str` | *required* | Provider name (e.g., `"openai"`, `"anthropic"`, `"gemini"`) |
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `display_name` | `str` | `""` | Human-readable display name |
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `capabilities` | `List[str]` | `[]` | Model capabilities: `"chat"`, `"vision"`, `"audio"`, `"embedding"` |
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"id": "gpt-4o",
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"provider": "openai",
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"display_name": "GPT-4o",
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"capabilities": ["chat", "vision"]
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## ProviderRegistry
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.base import ProviderRegistry
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Class-level registry for provider classes. Providers register themselves with metadata on import. This registry is used internally by `ProviderManager` but can also be used directly for introspection.
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### register()
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
@classmethod
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def register(
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cls,
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name: str,
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
provider_class: type,
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
env_var: str = "",
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
model_prefixes: Optional[List[str]] = None,
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
default_models: Optional[Dict[str, str]] = None,
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> None
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Register a provider class with its metadata. Called by each provider module at import time.
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Parameters:**
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `name` | `str` | *required* | Provider name (e.g., `"openai"`) |
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `provider_class` | `type` | *required* | The provider class |
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `env_var` | `str` | `""` | Environment variable for API key |
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `model_prefixes` | `Optional[List[str]]` | `None` | Model ID prefixes for auto-detection (e.g., `["gpt-", "o1-"]`) |
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `default_models` | `Optional[Dict[str, str]]` | `None` | Default models per capability (e.g., `{"chat": "gpt-4o", "vision": "gpt-4o"}`) |
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### get()
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
@classmethod
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def get(cls, name: str) -> type
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Return the provider class for a given name. Raises `ValueError` if the provider is not registered.
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### get_by_model()
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
@classmethod
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def get_by_model(cls, model_id: str) -> Optional[str]
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Return the provider name for a model ID based on prefix matching. Returns `None` if no match is found.
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### get_default_models()
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
@classmethod
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def get_default_models(cls, name: str) -> Dict[str, str]
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Return the default models dict for a provider, mapping capability names to model IDs.
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### available()
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
@classmethod
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def available(cls) -> List[str]
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Return names of providers whose required environment variable is set (or providers with no env var requirement, like Ollama).
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### all_registered()
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
@classmethod
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def all_registered(cls) -> Dict[str, Dict]
224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
226
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Return all registered providers and their metadata dictionaries.
227
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
228
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
229
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
230
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## OpenAICompatibleProvider
231
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
232
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
233
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.base import OpenAICompatibleProvider
234
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
235
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
236
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Base class for providers using OpenAI-compatible APIs (Together, Fireworks, Cerebras, xAI, Azure). Implements `chat()`, `analyze_image()`, and `list_models()` using the OpenAI client library. `transcribe_audio()` raises `NotImplementedError` by default.
237
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
238
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Constructor:**
239
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
240
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
241
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def __init__(self, api_key: Optional[str] = None, base_url: Optional[str] = None)
242
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
243
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
244
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
245
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
246
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `api_key` | `Optional[str]` | `None` | API key (falls back to `self.env_var` environment variable) |
247
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `base_url` | `Optional[str]` | `None` | API base URL (falls back to `self.base_url` class attribute) |
248
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
249
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Subclass attributes to override:**
250
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
251
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Attribute | Description |
252
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|
253
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `provider_name` | Provider identifier string |
254
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `base_url` | Default API base URL |
255
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `env_var` | Environment variable name for the API key |
256
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
257
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Usage tracking:** After each `chat()` or `analyze_image()` call, the provider stores token counts in `self._last_usage` as `{"input_tokens": int, "output_tokens": int}`. This is consumed by `ProviderManager._track()`.
258
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
259
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
260
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
261
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## ProviderManager
262
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
263
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
264
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.manager import ProviderManager
265
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
266
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
267
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
High-level router that selects the best available provider and model for each API call. Supports explicit model selection, forced provider, or automatic selection based on discovered capabilities.
268
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
269
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Constructor
270
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
271
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
272
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def __init__(
273
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
274
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
vision_model: Optional[str] = None,
275
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
chat_model: Optional[str] = None,
276
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
transcription_model: Optional[str] = None,
277
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
provider: Optional[str] = None,
278
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
auto: bool = True,
279
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
280
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
281
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
282
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
283
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
284
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `vision_model` | `Optional[str]` | `None` | Override model for vision tasks (e.g., `"gpt-4o"`) |
285
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `chat_model` | `Optional[str]` | `None` | Override model for chat/LLM tasks |
286
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `transcription_model` | `Optional[str]` | `None` | Override model for transcription |
287
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `provider` | `Optional[str]` | `None` | Force all tasks to a single provider |
288
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `auto` | `bool` | `True` | If `True` and no model specified, pick the best available |
289
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
290
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Attributes:**
291
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
292
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Attribute | Type | Description |
293
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|
294
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `usage` | `UsageTracker` | Tracks token counts and API costs across all calls |
295
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
296
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Auto-selection preferences
297
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
298
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
When `auto=True` and no explicit model is set, providers are tried in this order:
299
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
300
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Vision:** Gemini (`gemini-2.5-flash`) > OpenAI (`gpt-4o-mini`) > Anthropic (`claude-haiku-4-5-20251001`)
301
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
302
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Chat:** Anthropic (`claude-haiku-4-5-20251001`) > OpenAI (`gpt-4o-mini`) > Gemini (`gemini-2.5-flash`)
303
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
304
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Transcription:** OpenAI (`whisper-1`) > Gemini (`gemini-2.5-flash`)
305
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
306
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If no API-key-based provider is available, Ollama is tried as a fallback.
307
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
308
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### chat()
309
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
310
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
311
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def chat(
312
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
313
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
messages: list[dict],
314
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
max_tokens: int = 4096,
315
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
temperature: float = 0.7,
316
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str
317
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
318
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
319
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Send a chat completion to the best available provider. Automatically resolves which provider and model to use.
320
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
321
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Parameters:**
322
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
323
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
324
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
325
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `messages` | `list[dict]` | *required* | OpenAI-format messages |
326
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `max_tokens` | `int` | `4096` | Maximum response tokens |
327
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `temperature` | `float` | `0.7` | Sampling temperature |
328
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
329
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Returns:** `str` -- assistant response text.
330
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
331
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Raises:** `RuntimeError` if no provider is available for the `chat` capability.
332
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
333
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### analyze_image()
334
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
335
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
336
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def analyze_image(
337
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
338
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
image_bytes: bytes,
339
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
prompt: str,
340
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
max_tokens: int = 4096,
341
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str
342
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
343
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
344
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Analyze an image using the best available vision provider.
345
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
346
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Returns:** `str` -- analysis text.
347
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
348
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Raises:** `RuntimeError` if no provider is available for the `vision` capability.
349
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
350
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### transcribe_audio()
351
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
352
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
353
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def transcribe_audio(
354
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
355
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
audio_path: str | Path,
356
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
language: Optional[str] = None,
357
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
speaker_hints: Optional[list[str]] = None,
358
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> dict
359
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
360
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
361
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Transcribe audio. Prefers local Whisper (no file size limits, no API costs) when available, falling back to API-based transcription.
362
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
363
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Parameters:**
364
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
365
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
366
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
367
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `audio_path` | `str \| Path` | *required* | Path to the audio file |
368
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `language` | `Optional[str]` | `None` | Language hint |
369
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `speaker_hints` | `Optional[list[str]]` | `None` | Speaker names for better recognition |
370
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
371
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Returns:** `dict` -- transcription result with `text`, `segments`, `duration`.
372
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
373
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Local Whisper:** If `transcription_model` is unset or starts with `"whisper-local"`, the manager tries local Whisper first. Use `"whisper-local:large"` to specify a model size.
374
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
375
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### get_models_used()
376
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
377
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
378
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def get_models_used(self) -> dict[str, str]
379
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
380
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
381
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Return a dict mapping capability to `"provider/model"` string for tracking purposes.
382
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
383
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
384
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager()
385
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(pm.get_models_used())
386
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# {"vision": "gemini/gemini-2.5-flash", "chat": "anthropic/claude-haiku-4-5-20251001", ...}
387
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
388
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
389
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Usage examples
390
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
391
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
392
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.manager import ProviderManager
393
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
394
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Auto-select best providers
395
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager()
396
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
397
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Force everything through one provider
398
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager(provider="openai")
399
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
400
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Explicit model selection
401
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pm = ProviderManager(
402
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
vision_model="gpt-4o",
403
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
chat_model="claude-haiku-4-5-20251001",
404
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
transcription_model="whisper-local:large",
405
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
406
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
407
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Chat completion
408
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
response = pm.chat([
409
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{"role": "user", "content": "Summarize this meeting transcript..."}
410
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
])
411
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
412
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Image analysis
413
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
with open("diagram.png", "rb") as f:
414
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
analysis = pm.analyze_image(f.read(), "Describe this architecture diagram")
415
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
416
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Transcription with speaker hints
417
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = pm.transcribe_audio(
418
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"meeting.mp3",
419
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
language="en",
420
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
speaker_hints=["Alice", "Bob", "Charlie"],
421
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
422
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
423
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Check usage
424
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(pm.usage.summary())
425
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
426
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
427
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
428
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
429
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## discover_available_models()
430
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
431
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
432
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.discovery import discover_available_models
433
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
434
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
435
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
436
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def discover_available_models(
437
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
api_keys: Optional[dict[str, str]] = None,
438
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
force_refresh: bool = False,
439
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> list[ModelInfo]
440
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
441
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
442
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Discover available models from all configured providers. For each provider with a valid API key, calls `list_models()` and returns a unified, sorted list.
443
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
444
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Parameters:**
445
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
446
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Parameter | Type | Default | Description |
447
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
448
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `api_keys` | `Optional[dict[str, str]]` | `None` | Override API keys (defaults to environment variables) |
449
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `force_refresh` | `bool` | `False` | Force re-discovery, ignoring the session cache |
450
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
451
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Returns:** `list[ModelInfo]` -- all discovered models, sorted by provider then model ID.
452
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
453
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
**Caching:** Results are cached for the session. Use `force_refresh=True` or `clear_discovery_cache()` to refresh.
454
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
455
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
456
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from video_processor.providers.discovery import (
457
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
discover_available_models,
458
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
clear_discovery_cache,
459
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
460
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
461
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Discover models using environment variables
462
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
models = discover_available_models()
463
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for m in models:
464
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(f"{m.provider}/{m.id} - {m.capabilities}")
465
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
466
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Force refresh
467
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
models = discover_available_models(force_refresh=True)
468
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
469
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Override API keys
470
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
models = discover_available_models(api_keys={
471
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"openai": "sk-...",
472
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"anthropic": "sk-ant-...",
473
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
})
474
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
475
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Clear cache
476
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
clear_discovery_cache()
477
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
478
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
479
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### clear_discovery_cache()
480
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
481
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
482
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def clear_discovery_cache() -> None
483
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
484
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
485
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Clear the cached model list, forcing the next `discover_available_models()` call to re-query providers.
486
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
487
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
488
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
489
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Built-in Providers
490
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
491
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The following providers are registered automatically when the provider system initializes:
492
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
493
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Provider | Environment Variable | Capabilities | Default Chat Model |
494
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
495
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `openai` | `OPENAI_API_KEY` | chat, vision, audio | `gpt-4o-mini` |
496
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `anthropic` | `ANTHROPIC_API_KEY` | chat, vision | `claude-haiku-4-5-20251001` |
497
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `gemini` | `GEMINI_API_KEY` | chat, vision, audio | `gemini-2.5-flash` |
498
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `ollama` | *(none -- checks server)* | chat, vision | *(depends on installed models)* |
499
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `together` | `TOGETHER_API_KEY` | chat | *(varies)* |
500
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `fireworks` | `FIREWORKS_API_KEY` | chat | *(varies)* |
501
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `cerebras` | `CEREBRAS_API_KEY` | chat | *(varies)* |
502
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `xai` | `XAI_API_KEY` | chat | *(varies)* |
503
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `azure` | `AZURE_OPENAI_API_KEY` | chat, vision | *(varies)* |
504
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!