router-maestro 0.1.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- router_maestro/__init__.py +3 -0
- router_maestro/__main__.py +6 -0
- router_maestro/auth/__init__.py +18 -0
- router_maestro/auth/github_oauth.py +181 -0
- router_maestro/auth/manager.py +136 -0
- router_maestro/auth/storage.py +91 -0
- router_maestro/cli/__init__.py +1 -0
- router_maestro/cli/auth.py +167 -0
- router_maestro/cli/client.py +322 -0
- router_maestro/cli/config.py +132 -0
- router_maestro/cli/context.py +146 -0
- router_maestro/cli/main.py +42 -0
- router_maestro/cli/model.py +288 -0
- router_maestro/cli/server.py +117 -0
- router_maestro/cli/stats.py +76 -0
- router_maestro/config/__init__.py +72 -0
- router_maestro/config/contexts.py +29 -0
- router_maestro/config/paths.py +50 -0
- router_maestro/config/priorities.py +93 -0
- router_maestro/config/providers.py +34 -0
- router_maestro/config/server.py +115 -0
- router_maestro/config/settings.py +76 -0
- router_maestro/providers/__init__.py +31 -0
- router_maestro/providers/anthropic.py +203 -0
- router_maestro/providers/base.py +123 -0
- router_maestro/providers/copilot.py +346 -0
- router_maestro/providers/openai.py +188 -0
- router_maestro/providers/openai_compat.py +175 -0
- router_maestro/routing/__init__.py +5 -0
- router_maestro/routing/router.py +526 -0
- router_maestro/server/__init__.py +5 -0
- router_maestro/server/app.py +87 -0
- router_maestro/server/middleware/__init__.py +11 -0
- router_maestro/server/middleware/auth.py +66 -0
- router_maestro/server/oauth_sessions.py +159 -0
- router_maestro/server/routes/__init__.py +8 -0
- router_maestro/server/routes/admin.py +358 -0
- router_maestro/server/routes/anthropic.py +228 -0
- router_maestro/server/routes/chat.py +142 -0
- router_maestro/server/routes/models.py +34 -0
- router_maestro/server/schemas/__init__.py +57 -0
- router_maestro/server/schemas/admin.py +87 -0
- router_maestro/server/schemas/anthropic.py +246 -0
- router_maestro/server/schemas/openai.py +107 -0
- router_maestro/server/translation.py +636 -0
- router_maestro/stats/__init__.py +14 -0
- router_maestro/stats/heatmap.py +154 -0
- router_maestro/stats/storage.py +228 -0
- router_maestro/stats/tracker.py +73 -0
- router_maestro/utils/__init__.py +16 -0
- router_maestro/utils/logging.py +81 -0
- router_maestro/utils/tokens.py +51 -0
- router_maestro-0.1.2.dist-info/METADATA +383 -0
- router_maestro-0.1.2.dist-info/RECORD +57 -0
- router_maestro-0.1.2.dist-info/WHEEL +4 -0
- router_maestro-0.1.2.dist-info/entry_points.txt +2 -0
- router_maestro-0.1.2.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: router-maestro
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: Multi-model routing and load balancing system with OpenAI-compatible API
|
|
5
|
+
Author-email: Kanwen Li <likanwen@icloud.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: api,copilot,llm,load-balancing,openai,routing
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
17
|
+
Requires-Python: >=3.11
|
|
18
|
+
Requires-Dist: aiosqlite>=0.19.0
|
|
19
|
+
Requires-Dist: anthropic>=0.40.0
|
|
20
|
+
Requires-Dist: authlib>=1.3.0
|
|
21
|
+
Requires-Dist: fastapi>=0.109.0
|
|
22
|
+
Requires-Dist: httpx>=0.26.0
|
|
23
|
+
Requires-Dist: plotext>=5.2.0
|
|
24
|
+
Requires-Dist: pydantic-settings>=2.1.0
|
|
25
|
+
Requires-Dist: pydantic>=2.5.0
|
|
26
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
27
|
+
Requires-Dist: rich>=13.7.0
|
|
28
|
+
Requires-Dist: tiktoken>=0.5.0
|
|
29
|
+
Requires-Dist: typer>=0.12.0
|
|
30
|
+
Requires-Dist: uvicorn>=0.27.0
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: pyinstaller>=6.3.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest>=7.4.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
# Router-Maestro
|
|
39
|
+
|
|
40
|
+
Multi-model routing router with OpenAI-compatible and Anthropic-compatible APIs. Route LLM requests across GitHub Copilot, OpenAI, Anthropic, and custom providers with intelligent fallback and priority-based selection.
|
|
41
|
+
|
|
42
|
+
## TL;DR
|
|
43
|
+
|
|
44
|
+
**Use GitHub Copilot's models (Claude, GPT-4o, o3-mini) with Claude Code or any OpenAI/Anthropic-compatible client.**
|
|
45
|
+
|
|
46
|
+
Router-Maestro acts as a proxy that gives you access to models from multiple providers through a unified API. Authenticate once with GitHub Copilot, and use its models anywhere that supports OpenAI or Anthropic APIs.
|
|
47
|
+
|
|
48
|
+
## Features
|
|
49
|
+
|
|
50
|
+
- **Multi-provider support**: GitHub Copilot (OAuth), OpenAI, Anthropic, and custom OpenAI-compatible endpoints
|
|
51
|
+
- **Intelligent routing**: Priority-based model selection with automatic fallback on failure
|
|
52
|
+
- **Dual API compatibility**: Both OpenAI (`/v1/...`) and Anthropic (`/v1/messages`) API formats
|
|
53
|
+
- **Cross-provider translation**: Seamlessly route OpenAI requests to Anthropic providers and vice versa
|
|
54
|
+
- **Configuration hot-reload**: Auto-reload config files every 5 minutes without server restart
|
|
55
|
+
- **Usage tracking**: Token usage statistics with heatmap visualization
|
|
56
|
+
- **CLI management**: Full command-line interface for configuration and server control
|
|
57
|
+
- **Docker ready**: Production-ready Docker images with Traefik integration
|
|
58
|
+
|
|
59
|
+
## Table of Contents
|
|
60
|
+
|
|
61
|
+
- [Quick Start](#quick-start)
|
|
62
|
+
- [Core Concepts](#core-concepts)
|
|
63
|
+
- [CLI Reference](#cli-reference)
|
|
64
|
+
- [API Reference](#api-reference)
|
|
65
|
+
- [Configuration](#configuration)
|
|
66
|
+
- [Deployment](#deployment)
|
|
67
|
+
- [License](#license)
|
|
68
|
+
|
|
69
|
+
## Quick Start
|
|
70
|
+
|
|
71
|
+
Get up and running in 4 steps:
|
|
72
|
+
|
|
73
|
+
### 1. Install
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pip install router-maestro
|
|
77
|
+
# or
|
|
78
|
+
uv pip install router-maestro
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 2. Start the Server
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
router-maestro server start --port 8080
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 3. Authenticate with GitHub Copilot
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
router-maestro auth login github-copilot
|
|
91
|
+
|
|
92
|
+
# Follow the prompts:
|
|
93
|
+
# 1. Visit https://github.com/login/device
|
|
94
|
+
# 2. Enter the displayed code
|
|
95
|
+
# 3. Authorize "GitHub Copilot Chat"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 4. Configure Claude Code
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
router-maestro config claude-code
|
|
102
|
+
# Follow the wizard to select models
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Done!** Now run `claude` and your requests will route through Router-Maestro.
|
|
106
|
+
|
|
107
|
+
> **For production deployment**, see the [Deployment](#deployment) section.
|
|
108
|
+
|
|
109
|
+
## Core Concepts
|
|
110
|
+
|
|
111
|
+
### Model Identification
|
|
112
|
+
|
|
113
|
+
Models are identified using the format `{provider}/{model-id}`:
|
|
114
|
+
|
|
115
|
+
| Example | Description |
|
|
116
|
+
|---------|-------------|
|
|
117
|
+
| `github-copilot/gpt-4o` | GPT-4o via GitHub Copilot |
|
|
118
|
+
| `github-copilot/claude-sonnet-4` | Claude Sonnet 4 via GitHub Copilot |
|
|
119
|
+
| `openai/gpt-4-turbo` | GPT-4 Turbo via OpenAI |
|
|
120
|
+
| `anthropic/claude-3-5-sonnet` | Claude 3.5 Sonnet via Anthropic |
|
|
121
|
+
|
|
122
|
+
### Auto-Routing
|
|
123
|
+
|
|
124
|
+
Use the special model name `router-maestro` for automatic provider selection:
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{"model": "router-maestro", "messages": [...]}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The router will try models in priority order and fall back to the next on failure.
|
|
131
|
+
|
|
132
|
+
### Priority & Fallback
|
|
133
|
+
|
|
134
|
+
**Priority** determines which model is tried first when using auto-routing.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# Set priorities
|
|
138
|
+
router-maestro model priority github-copilot/claude-sonnet-4 --position 1
|
|
139
|
+
router-maestro model priority github-copilot/gpt-4o --position 2
|
|
140
|
+
|
|
141
|
+
# View priorities
|
|
142
|
+
router-maestro model priority list
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Fallback** triggers when a request fails with a retryable error (429, 5xx):
|
|
146
|
+
|
|
147
|
+
| Strategy | Behavior |
|
|
148
|
+
|----------|----------|
|
|
149
|
+
| `priority` | Try next model in priorities list |
|
|
150
|
+
| `same-model` | Try same model on different provider |
|
|
151
|
+
| `none` | Fail immediately |
|
|
152
|
+
|
|
153
|
+
Configure in `~/.config/router-maestro/priorities.json`:
|
|
154
|
+
|
|
155
|
+
```json
|
|
156
|
+
{
|
|
157
|
+
"priorities": ["github-copilot/claude-sonnet-4", "github-copilot/gpt-4o"],
|
|
158
|
+
"fallback": {"strategy": "priority", "maxRetries": 2}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Cross-Provider Translation
|
|
163
|
+
|
|
164
|
+
Router-Maestro automatically translates between OpenAI and Anthropic formats:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Use Anthropic API with OpenAI provider
|
|
168
|
+
POST /v1/messages {"model": "openai/gpt-4o", ...}
|
|
169
|
+
|
|
170
|
+
# Use OpenAI API with Anthropic provider
|
|
171
|
+
POST /v1/chat/completions {"model": "anthropic/claude-3-5-sonnet", ...}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## CLI Reference
|
|
175
|
+
|
|
176
|
+
### Server
|
|
177
|
+
|
|
178
|
+
| Command | Description |
|
|
179
|
+
|---------|-------------|
|
|
180
|
+
| `server start --port 8080` | Start the server |
|
|
181
|
+
| `server stop` | Stop the server |
|
|
182
|
+
| `server info` | Show server status |
|
|
183
|
+
|
|
184
|
+
### Authentication
|
|
185
|
+
|
|
186
|
+
| Command | Description |
|
|
187
|
+
|---------|-------------|
|
|
188
|
+
| `auth login [provider]` | Authenticate with a provider |
|
|
189
|
+
| `auth logout <provider>` | Remove authentication |
|
|
190
|
+
| `auth list` | List authenticated providers |
|
|
191
|
+
|
|
192
|
+
### Models
|
|
193
|
+
|
|
194
|
+
| Command | Description |
|
|
195
|
+
|---------|-------------|
|
|
196
|
+
| `model list` | List available models |
|
|
197
|
+
| `model refresh` | Refresh models cache |
|
|
198
|
+
| `model priority list` | Show priorities |
|
|
199
|
+
| `model priority <model> --position <n>` | Set priority |
|
|
200
|
+
| `model fallback show` | Show fallback config |
|
|
201
|
+
|
|
202
|
+
### Contexts (Remote Management)
|
|
203
|
+
|
|
204
|
+
| Command | Description |
|
|
205
|
+
|---------|-------------|
|
|
206
|
+
| `context show` | Show current context |
|
|
207
|
+
| `context list` | List all contexts |
|
|
208
|
+
| `context set <name>` | Switch context |
|
|
209
|
+
| `context add <name> --endpoint <url> --api-key <key>` | Add remote context |
|
|
210
|
+
| `context test` | Test connection |
|
|
211
|
+
|
|
212
|
+
### Other
|
|
213
|
+
|
|
214
|
+
| Command | Description |
|
|
215
|
+
|---------|-------------|
|
|
216
|
+
| `config claude-code` | Generate Claude Code settings |
|
|
217
|
+
| `stats --days 7` | Show usage statistics |
|
|
218
|
+
| `stats --days 30 --heatmap` | Show heatmap visualization |
|
|
219
|
+
|
|
220
|
+
## API Reference
|
|
221
|
+
|
|
222
|
+
### OpenAI-Compatible
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# Chat completions
|
|
226
|
+
POST /v1/chat/completions
|
|
227
|
+
{
|
|
228
|
+
"model": "github-copilot/gpt-4o",
|
|
229
|
+
"messages": [{"role": "user", "content": "Hello"}],
|
|
230
|
+
"stream": false
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
# List models
|
|
234
|
+
GET /v1/models
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Anthropic-Compatible
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
# Messages
|
|
241
|
+
POST /v1/messages
|
|
242
|
+
POST /api/anthropic/v1/messages
|
|
243
|
+
{
|
|
244
|
+
"model": "github-copilot/claude-sonnet-4",
|
|
245
|
+
"max_tokens": 1024,
|
|
246
|
+
"messages": [{"role": "user", "content": "Hello"}]
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
# Count tokens
|
|
250
|
+
POST /v1/messages/count_tokens
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Admin
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
POST /api/admin/models/refresh # Refresh model cache
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Configuration
|
|
260
|
+
|
|
261
|
+
### File Locations
|
|
262
|
+
|
|
263
|
+
Following XDG Base Directory specification:
|
|
264
|
+
|
|
265
|
+
| Type | Path | Contents |
|
|
266
|
+
|------|------|----------|
|
|
267
|
+
| **Config** | `~/.config/router-maestro/` | |
|
|
268
|
+
| | `providers.json` | Custom provider definitions |
|
|
269
|
+
| | `priorities.json` | Model priorities and fallback |
|
|
270
|
+
| | `contexts.json` | Deployment contexts |
|
|
271
|
+
| **Data** | `~/.local/share/router-maestro/` | |
|
|
272
|
+
| | `auth.json` | OAuth tokens |
|
|
273
|
+
| | `server.json` | Server state |
|
|
274
|
+
| | `stats.db` | Usage statistics |
|
|
275
|
+
|
|
276
|
+
### Custom Providers
|
|
277
|
+
|
|
278
|
+
Add OpenAI-compatible providers in `~/.config/router-maestro/providers.json`:
|
|
279
|
+
|
|
280
|
+
```json
|
|
281
|
+
{
|
|
282
|
+
"providers": {
|
|
283
|
+
"ollama": {
|
|
284
|
+
"type": "openai-compatible",
|
|
285
|
+
"baseURL": "http://localhost:11434/v1",
|
|
286
|
+
"models": {
|
|
287
|
+
"llama3": {"name": "Llama 3"},
|
|
288
|
+
"mistral": {"name": "Mistral 7B"}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
Set API keys via environment variables (uppercase, hyphens → underscores):
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
export OLLAMA_API_KEY="sk-..."
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Hot-Reload
|
|
302
|
+
|
|
303
|
+
Configuration files are automatically reloaded every 5 minutes:
|
|
304
|
+
|
|
305
|
+
| File | Auto-Reload |
|
|
306
|
+
|------|-------------|
|
|
307
|
+
| `priorities.json` | ✓ (5 min) |
|
|
308
|
+
| `providers.json` | ✓ (5 min) |
|
|
309
|
+
| `auth.json` | Requires restart |
|
|
310
|
+
|
|
311
|
+
Force immediate reload:
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
router-maestro model refresh
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Deployment
|
|
318
|
+
|
|
319
|
+
### Docker Deployment
|
|
320
|
+
|
|
321
|
+
Deploy to a VPS with Docker Compose:
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
# On your VPS
|
|
325
|
+
git clone https://github.com/likanwen/router-maestro.git
|
|
326
|
+
cd router-maestro
|
|
327
|
+
cp .env.example .env # Edit with your domain
|
|
328
|
+
docker compose up -d
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Configure `.env`:
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
DOMAIN=api.example.com
|
|
335
|
+
CF_DNS_API_TOKEN=your_cloudflare_token # For HTTPS
|
|
336
|
+
ACME_EMAIL=your@email.com
|
|
337
|
+
ROUTER_MAESTRO_API_KEY=$(openssl rand -hex 32)
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Authenticate inside the container:
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
docker compose exec router-maestro /bin/sh
|
|
344
|
+
router-maestro auth login github-copilot
|
|
345
|
+
# Follow OAuth flow, then exit
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Remote Management
|
|
349
|
+
|
|
350
|
+
Manage your VPS deployment from your local machine using contexts:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
# Add remote context
|
|
354
|
+
router-maestro context add my-vps \
|
|
355
|
+
--endpoint https://api.example.com \
|
|
356
|
+
--api-key your_api_key
|
|
357
|
+
|
|
358
|
+
# Switch to remote
|
|
359
|
+
router-maestro context set my-vps
|
|
360
|
+
|
|
361
|
+
# Now all commands target the VPS
|
|
362
|
+
router-maestro model list
|
|
363
|
+
router-maestro stats --days 7
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### HTTPS with Traefik
|
|
367
|
+
|
|
368
|
+
The Docker Compose setup includes Traefik for automatic HTTPS via Let's Encrypt with DNS challenge.
|
|
369
|
+
|
|
370
|
+
For detailed configuration options including:
|
|
371
|
+
- Other DNS providers (Route53, DigitalOcean, etc.)
|
|
372
|
+
- HTTP challenge setup
|
|
373
|
+
- Traefik dashboard configuration
|
|
374
|
+
|
|
375
|
+
See [docs/deployment.md](docs/deployment.md).
|
|
376
|
+
|
|
377
|
+
## License
|
|
378
|
+
|
|
379
|
+
MIT License - see [LICENSE](LICENSE) file.
|
|
380
|
+
|
|
381
|
+
## Contributing
|
|
382
|
+
|
|
383
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
router_maestro/__init__.py,sha256=DjSxTt-117MUK3rqehh5MME5nt25J3uPF88_sJGhvBk,92
|
|
2
|
+
router_maestro/__main__.py,sha256=cUHr8B7JBiv5HhnN6l2iayDkGSBpI5Kf4I3jv9I_I3o,121
|
|
3
|
+
router_maestro/auth/__init__.py,sha256=0JgD1w2gtGSkj809kgSKQanYYkncg6eF-hHoz-jQPgo,353
|
|
4
|
+
router_maestro/auth/github_oauth.py,sha256=acQlAA2Zh6c8KQYdzXbC4ww0EJ41AgvbI5ixpFuNoRg,5060
|
|
5
|
+
router_maestro/auth/manager.py,sha256=OQjdofmjVndTQQIrAU7O-hJAL-w_ijYRU09fZNU8E3g,4554
|
|
6
|
+
router_maestro/auth/storage.py,sha256=TCLxgQ1lWcWD4xJXJzx5OMpvuAun_LSRItK0zhR6H0Y,2755
|
|
7
|
+
router_maestro/cli/__init__.py,sha256=yIAshaHpLL0WrDFmRpoMRM2EUe75x0wmM5NlGW3C89s,37
|
|
8
|
+
router_maestro/cli/auth.py,sha256=eq5LBUohbMnHS4dZeyvq4OQAjzdrJ-StP2FGuUhkKa0,5940
|
|
9
|
+
router_maestro/cli/client.py,sha256=f1Q4vuS0N7Vfmy1LVavVcTpsKEprjonX4EPVH4SG-zo,10448
|
|
10
|
+
router_maestro/cli/config.py,sha256=lVmMlUASUynbqOQawuQQhi8C3h2OvGScZvaeIArZ2ns,4662
|
|
11
|
+
router_maestro/cli/context.py,sha256=EPbT7fReIW17veU76CSAcv8QjzMsCIPm1QDBlGsV8fQ,4549
|
|
12
|
+
router_maestro/cli/main.py,sha256=L08B23nM-DCC_wgUAk7Dt6TZmYY03t2pbo1Rh2Bzugc,1360
|
|
13
|
+
router_maestro/cli/model.py,sha256=2IG3IpQWh8Ejdv5Htcgr90O2v2UAa80TU15oOniPdvk,9054
|
|
14
|
+
router_maestro/cli/server.py,sha256=iOEOuug8MvPtY5vCL8KubOkHNt35H6R1nI73dStI7Wc,3697
|
|
15
|
+
router_maestro/cli/stats.py,sha256=MPRMNbGbXDnb1tIn_jyyJxoHEHLEN1vANLMj1cImkeg,2746
|
|
16
|
+
router_maestro/config/__init__.py,sha256=rATq3PIA8vKLpunsCLeCA7GbKjqyzBvlBgI7OwM-6FI,1664
|
|
17
|
+
router_maestro/config/contexts.py,sha256=ujaH5I3xa3Eg_KlRaF5KlmsACuUqoKqsp1-i1J2kQz4,923
|
|
18
|
+
router_maestro/config/paths.py,sha256=xaAi9LuTFSag7yGJp9oCnrcTpnXcaPTMKU5yAIYkCT8,1617
|
|
19
|
+
router_maestro/config/priorities.py,sha256=wEBs6CmLQiw0ehuA-kh7topyac6APopxaR83CpnHhDQ,2669
|
|
20
|
+
router_maestro/config/providers.py,sha256=yMU_DFh4_eQXMT8jGImqwzAPHp0L3fR34gG2r-4Zhnw,1158
|
|
21
|
+
router_maestro/config/server.py,sha256=Mr7Axbo8b1z3OFEe_G8VuO7wvx_pA32-ZBbT4nSRdX0,3049
|
|
22
|
+
router_maestro/config/settings.py,sha256=cEgE0XjdYMbB39wJDQiTurWSbfJwjAjLI8g7ZOiyd1o,2363
|
|
23
|
+
router_maestro/providers/__init__.py,sha256=Cic08fXrcBPbxSLOqLg3edTThop6j--AqdcwI7wJSp8,759
|
|
24
|
+
router_maestro/providers/anthropic.py,sha256=zhBDtPootCVCYfGyrsogdy3j8jC1aMwi01hWkg-uKmA,8077
|
|
25
|
+
router_maestro/providers/base.py,sha256=2WvR-jjkYNkQUy6EBXvuOkv3v7xCvAfgVigvuKukG3o,3111
|
|
26
|
+
router_maestro/providers/copilot.py,sha256=NieOXBecwymSnB1Nm_JKVvzeZyZnO8g6Y1kNaLHy3XE,12974
|
|
27
|
+
router_maestro/providers/openai.py,sha256=Bsq5mzAVf4CawH2Tn80y3-MyLLVeZ3VsPxGDNH1t_Nk,7647
|
|
28
|
+
router_maestro/providers/openai_compat.py,sha256=ef4RttKVZUTBiRed4BEuC2Jg8vr5GM7YqPUtFYeAhZo,6383
|
|
29
|
+
router_maestro/routing/__init__.py,sha256=eCEQVbg1LAfcSVLQZpZtYf8ImbOhFIaR7POUb1pCbXM,169
|
|
30
|
+
router_maestro/routing/router.py,sha256=4T-yBI9fCRKXeyjeVT6aSfALj2OMaNwsn11qXntno-o,20390
|
|
31
|
+
router_maestro/server/__init__.py,sha256=YzExJfP0jw6hXx84lo0yPVU0wG17B16SfdyEpjstpxk,128
|
|
32
|
+
router_maestro/server/app.py,sha256=rI2TuCS_STzmzdds5Tq2vzoP9y9bpRFJJwNs5e8uTbU,2707
|
|
33
|
+
router_maestro/server/oauth_sessions.py,sha256=r_VM6vAtbo5HAmXjYt6XoECBcWGxqABKGbVmW8HoCz0,4625
|
|
34
|
+
router_maestro/server/translation.py,sha256=TrYfIb5M5MAUC4TD5By8X3RONSZ6cV1YS_JwzIc-bVk,22170
|
|
35
|
+
router_maestro/server/middleware/__init__.py,sha256=PhtP2E04wApnOUBLE76mrOa0sSHp7reHmIl7PaCAylY,187
|
|
36
|
+
router_maestro/server/middleware/auth.py,sha256=Ak3k5cC8m4qPGUIheuOB--QiFvs6GIAcTRJqtCGCjAA,2018
|
|
37
|
+
router_maestro/server/routes/__init__.py,sha256=eGEpNCnSRVQC1pFL7_evDmZfkMrviuI-n1okAS-YnhM,397
|
|
38
|
+
router_maestro/server/routes/admin.py,sha256=5xr0D-9SKuz0T48b7pRs9hueHPHTN-WlsBq5r_VCb2s,11500
|
|
39
|
+
router_maestro/server/routes/anthropic.py,sha256=T5-rHBPDyPxP4Cs0yzm7Kvvn-zgV6jspnZdoSVDeH2w,8041
|
|
40
|
+
router_maestro/server/routes/chat.py,sha256=vyYX1ILhgAb9HYD87h1U3c5btpplqkTaejA81pWg4Oo,4752
|
|
41
|
+
router_maestro/server/routes/models.py,sha256=PTSXojNFN9j90Bke74ZO6sEsfIc8u_4A69eW1QzFIbc,716
|
|
42
|
+
router_maestro/server/schemas/__init__.py,sha256=rNGneAw3A3MKdCwdbXURjZcWAjQotgwMvJNRXXp0Lwo,1250
|
|
43
|
+
router_maestro/server/schemas/admin.py,sha256=ITmXy9xWhVnZk0T3TSOOMQKgcHzou9fsc8DS30fo2rU,3052
|
|
44
|
+
router_maestro/server/schemas/anthropic.py,sha256=hNl6rZ7AX-HdLxtsd0cWpZjpIyK1AkEBcuiQpZQqPYc,6136
|
|
45
|
+
router_maestro/server/schemas/openai.py,sha256=s2487RYIn1h-CIaUpLue9BScDaTsafbVg5yc-kKhfME,2141
|
|
46
|
+
router_maestro/stats/__init__.py,sha256=igFtk7xFgvxk_AQsbQlzz8KBubvrmgnNfe-BS9ufuGM,403
|
|
47
|
+
router_maestro/stats/heatmap.py,sha256=G_yerQcLOdP6cND-KTlhXBBNaRdcOBxy6HzGyUlDj6A,5255
|
|
48
|
+
router_maestro/stats/storage.py,sha256=WsFrhmgs9eWKcAPRGDrhT4Ft1-Uzuiz3Q0fYNfgVvQs,7676
|
|
49
|
+
router_maestro/stats/tracker.py,sha256=iutAfdm6JL2rUTBLUnLbUiSaBEAxkzXmi8d5iEllCcI,1984
|
|
50
|
+
router_maestro/utils/__init__.py,sha256=oSQyV--FueMPggRfjWWVnAKtjkcZWFOm9hCTymu0oZU,409
|
|
51
|
+
router_maestro/utils/logging.py,sha256=gJWoRYibAxCWn4VmTmnrwpBRzQ7Uu5YIEk5zDiF9X_k,2393
|
|
52
|
+
router_maestro/utils/tokens.py,sha256=t2E5BrrE5X3VCgw-rYFMkic7heJ0huj9rrOXAIlKq8o,1330
|
|
53
|
+
router_maestro-0.1.2.dist-info/METADATA,sha256=1qwn774LuxcaBm_iiszi5ZcPTS_F7-mRQWi2VgD-5m0,10033
|
|
54
|
+
router_maestro-0.1.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
55
|
+
router_maestro-0.1.2.dist-info/entry_points.txt,sha256=zoFUxxvNcFe0nTgpRbIdygIDEOla3KbvW6HbOCOlgv4,63
|
|
56
|
+
router_maestro-0.1.2.dist-info/licenses/LICENSE,sha256=Ea86BSGu7_tpLAuzif_JmM9zjMoKQEf95VVF9sZw3Jo,1084
|
|
57
|
+
router_maestro-0.1.2.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Router-Maestro Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|