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.
Files changed (57) hide show
  1. router_maestro/__init__.py +3 -0
  2. router_maestro/__main__.py +6 -0
  3. router_maestro/auth/__init__.py +18 -0
  4. router_maestro/auth/github_oauth.py +181 -0
  5. router_maestro/auth/manager.py +136 -0
  6. router_maestro/auth/storage.py +91 -0
  7. router_maestro/cli/__init__.py +1 -0
  8. router_maestro/cli/auth.py +167 -0
  9. router_maestro/cli/client.py +322 -0
  10. router_maestro/cli/config.py +132 -0
  11. router_maestro/cli/context.py +146 -0
  12. router_maestro/cli/main.py +42 -0
  13. router_maestro/cli/model.py +288 -0
  14. router_maestro/cli/server.py +117 -0
  15. router_maestro/cli/stats.py +76 -0
  16. router_maestro/config/__init__.py +72 -0
  17. router_maestro/config/contexts.py +29 -0
  18. router_maestro/config/paths.py +50 -0
  19. router_maestro/config/priorities.py +93 -0
  20. router_maestro/config/providers.py +34 -0
  21. router_maestro/config/server.py +115 -0
  22. router_maestro/config/settings.py +76 -0
  23. router_maestro/providers/__init__.py +31 -0
  24. router_maestro/providers/anthropic.py +203 -0
  25. router_maestro/providers/base.py +123 -0
  26. router_maestro/providers/copilot.py +346 -0
  27. router_maestro/providers/openai.py +188 -0
  28. router_maestro/providers/openai_compat.py +175 -0
  29. router_maestro/routing/__init__.py +5 -0
  30. router_maestro/routing/router.py +526 -0
  31. router_maestro/server/__init__.py +5 -0
  32. router_maestro/server/app.py +87 -0
  33. router_maestro/server/middleware/__init__.py +11 -0
  34. router_maestro/server/middleware/auth.py +66 -0
  35. router_maestro/server/oauth_sessions.py +159 -0
  36. router_maestro/server/routes/__init__.py +8 -0
  37. router_maestro/server/routes/admin.py +358 -0
  38. router_maestro/server/routes/anthropic.py +228 -0
  39. router_maestro/server/routes/chat.py +142 -0
  40. router_maestro/server/routes/models.py +34 -0
  41. router_maestro/server/schemas/__init__.py +57 -0
  42. router_maestro/server/schemas/admin.py +87 -0
  43. router_maestro/server/schemas/anthropic.py +246 -0
  44. router_maestro/server/schemas/openai.py +107 -0
  45. router_maestro/server/translation.py +636 -0
  46. router_maestro/stats/__init__.py +14 -0
  47. router_maestro/stats/heatmap.py +154 -0
  48. router_maestro/stats/storage.py +228 -0
  49. router_maestro/stats/tracker.py +73 -0
  50. router_maestro/utils/__init__.py +16 -0
  51. router_maestro/utils/logging.py +81 -0
  52. router_maestro/utils/tokens.py +51 -0
  53. router_maestro-0.1.2.dist-info/METADATA +383 -0
  54. router_maestro-0.1.2.dist-info/RECORD +57 -0
  55. router_maestro-0.1.2.dist-info/WHEEL +4 -0
  56. router_maestro-0.1.2.dist-info/entry_points.txt +2 -0
  57. 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,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ router-maestro = router_maestro.cli.main:app
@@ -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.