nemo-switchyard 0.0.1.dev1__cp312-abi3-win_arm64.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.
- nemo_switchyard-0.0.1.dev1.dist-info/METADATA +279 -0
- nemo_switchyard-0.0.1.dev1.dist-info/RECORD +177 -0
- nemo_switchyard-0.0.1.dev1.dist-info/WHEEL +4 -0
- nemo_switchyard-0.0.1.dev1.dist-info/entry_points.txt +2 -0
- nemo_switchyard-0.0.1.dev1.dist-info/licenses/LICENSE +204 -0
- nemo_switchyard-0.0.1.dev1.dist-info/licenses/NOTICE +40 -0
- switchyard/__init__.py +243 -0
- switchyard/cli/__init__.py +5 -0
- switchyard/cli/command_utils.py +85 -0
- switchyard/cli/config/__init__.py +5 -0
- switchyard/cli/config/user_config.py +692 -0
- switchyard/cli/configure_command.py +614 -0
- switchyard/cli/intake_cli_config.py +117 -0
- switchyard/cli/launch_command.py +1121 -0
- switchyard/cli/launchers/__init__.py +5 -0
- switchyard/cli/launchers/claude_alias.py +43 -0
- switchyard/cli/launchers/claude_code_launcher.py +542 -0
- switchyard/cli/launchers/codex_cli_launcher.py +642 -0
- switchyard/cli/launchers/codex_model_catalog.py +160 -0
- switchyard/cli/launchers/launch_intake_config.py +211 -0
- switchyard/cli/launchers/launcher_runtime.py +444 -0
- switchyard/cli/launchers/live_stats_footer.py +156 -0
- switchyard/cli/launchers/openclaw_launcher.py +702 -0
- switchyard/cli/launchers/proxy_health_monitor.py +44 -0
- switchyard/cli/launchers/session_summary.py +84 -0
- switchyard/cli/model_catalog/__init__.py +5 -0
- switchyard/cli/model_catalog/model_discovery.py +233 -0
- switchyard/cli/models.py +79 -0
- switchyard/cli/output.py +171 -0
- switchyard/cli/route_bundle.py +1490 -0
- switchyard/cli/routing/__init__.py +20 -0
- switchyard/cli/routing/route_builder.py +289 -0
- switchyard/cli/status.py +213 -0
- switchyard/cli/switchyard_cli.py +1453 -0
- switchyard/cli/tui/__init__.py +29 -0
- switchyard/cli/tui/choice_selector.py +55 -0
- switchyard/cli/tui/launch_config_wizard.py +103 -0
- switchyard/cli/tui/model_selector.py +251 -0
- switchyard/cli/tui/terminal_capabilities.py +88 -0
- switchyard/cli/tui/tui_session.py +111 -0
- switchyard/lib/__init__.py +16 -0
- switchyard/lib/backends/__init__.py +42 -0
- switchyard/lib/backends/anthropic_cache_breakpoint_backend.py +264 -0
- switchyard/lib/backends/anthropic_native_llm_backend.py +8 -0
- switchyard/lib/backends/backend_format_resolver.py +392 -0
- switchyard/lib/backends/deterministic_routing_llm_backend.py +166 -0
- switchyard/lib/backends/health_poller.py +181 -0
- switchyard/lib/backends/latency_service_llm_backend.py +771 -0
- switchyard/lib/backends/llm_target.py +106 -0
- switchyard/lib/backends/multi_llm_backend.py +86 -0
- switchyard/lib/backends/openai_llm_backend.py +8 -0
- switchyard/lib/backends/openai_native_backend.py +8 -0
- switchyard/lib/backends/stats_llm_backend.py +8 -0
- switchyard/lib/chat_request/__init__.py +17 -0
- switchyard/lib/chat_request/anthropic.py +12 -0
- switchyard/lib/chat_request/base.py +14 -0
- switchyard/lib/chat_request/openai_chat.py +12 -0
- switchyard/lib/chat_request/openai_responses.py +12 -0
- switchyard/lib/chat_response/__init__.py +39 -0
- switchyard/lib/chat_response/anthropic.py +19 -0
- switchyard/lib/chat_response/base.py +14 -0
- switchyard/lib/chat_response/openai_chat.py +15 -0
- switchyard/lib/chat_response/openai_responses.py +19 -0
- switchyard/lib/chat_response/streaming_response_accumulator.py +752 -0
- switchyard/lib/config/__init__.py +20 -0
- switchyard/lib/config/intake_sink_config.py +8 -0
- switchyard/lib/config/latency_service_backend_config.py +121 -0
- switchyard/lib/conversation_turn.py +68 -0
- switchyard/lib/cost_estimator.py +441 -0
- switchyard/lib/endpoints/__init__.py +55 -0
- switchyard/lib/endpoints/anthropic_messages_endpoint.py +120 -0
- switchyard/lib/endpoints/base.py +39 -0
- switchyard/lib/endpoints/dispatch.py +111 -0
- switchyard/lib/endpoints/error_envelope.py +130 -0
- switchyard/lib/endpoints/models_endpoint.py +42 -0
- switchyard/lib/endpoints/openai_chat_endpoint.py +101 -0
- switchyard/lib/endpoints/outcome_metrics.py +249 -0
- switchyard/lib/endpoints/prometheus_emitter.py +71 -0
- switchyard/lib/endpoints/responses_endpoint.py +98 -0
- switchyard/lib/endpoints/sse_helpers.py +207 -0
- switchyard/lib/endpoints/stats_endpoint.py +113 -0
- switchyard/lib/endpoints/upstream_error.py +176 -0
- switchyard/lib/endpoints/upstream_error_log.py +81 -0
- switchyard/lib/live_stats_collector.py +268 -0
- switchyard/lib/llm_client.py +124 -0
- switchyard/lib/model_listing.py +131 -0
- switchyard/lib/plugin/__init__.py +43 -0
- switchyard/lib/plugin/plugin_client.py +461 -0
- switchyard/lib/plugin/plugin_protocol.py +166 -0
- switchyard/lib/processors/__init__.py +59 -0
- switchyard/lib/processors/_structured_output.py +124 -0
- switchyard/lib/processors/cascade/__init__.py +48 -0
- switchyard/lib/processors/cascade/classifier.py +249 -0
- switchyard/lib/processors/cascade/decision_log.py +43 -0
- switchyard/lib/processors/cascade/dimensions.py +78 -0
- switchyard/lib/processors/cascade/picker.py +142 -0
- switchyard/lib/processors/cascade/prompts/tier_classifier.md +5 -0
- switchyard/lib/processors/cascade/scorer.py +55 -0
- switchyard/lib/processors/cascade_request_processor.py +124 -0
- switchyard/lib/processors/empty_tool_content_normalizer.py +85 -0
- switchyard/lib/processors/fixed_tier_request_processor.py +55 -0
- switchyard/lib/processors/format_translate.py +312 -0
- switchyard/lib/processors/intake_client.py +230 -0
- switchyard/lib/processors/intake_payload_builder.py +301 -0
- switchyard/lib/processors/intake_request_processor.py +8 -0
- switchyard/lib/processors/intake_response_processor.py +8 -0
- switchyard/lib/processors/llm_classifier/__init__.py +88 -0
- switchyard/lib/processors/llm_classifier/presets.py +446 -0
- switchyard/lib/processors/llm_classifier/request_processor.py +660 -0
- switchyard/lib/processors/llm_classifier/signals.py +568 -0
- switchyard/lib/processors/llm_classifier/tier_selector_request_processor.py +362 -0
- switchyard/lib/processors/model_rewrite_request_processor.py +26 -0
- switchyard/lib/processors/plan_execute/__init__.py +72 -0
- switchyard/lib/processors/plan_execute/plan.py +86 -0
- switchyard/lib/processors/plan_execute/request_processor.py +1005 -0
- switchyard/lib/processors/plugin_routing_request_processor.py +319 -0
- switchyard/lib/processors/random_routing_request_processor.py +58 -0
- switchyard/lib/processors/reasoning_effort_normalizer.py +68 -0
- switchyard/lib/processors/reasoning_hint.py +23 -0
- switchyard/lib/processors/rl_logging_request_processor.py +43 -0
- switchyard/lib/processors/rl_logging_response_processor.py +187 -0
- switchyard/lib/processors/routellm_request_processor.py +195 -0
- switchyard/lib/processors/stats_request_processor.py +8 -0
- switchyard/lib/processors/stats_response_processor_accumulator.py +8 -0
- switchyard/lib/processors/stats_response_processor_live_collector.py +330 -0
- switchyard/lib/processors/turn_based_router_request_processor.py +238 -0
- switchyard/lib/profiles/__init__.py +97 -0
- switchyard/lib/profiles/cascade.py +100 -0
- switchyard/lib/profiles/cascade_config.py +84 -0
- switchyard/lib/profiles/chain.py +393 -0
- switchyard/lib/profiles/deterministic_routing_config.py +161 -0
- switchyard/lib/profiles/deterministic_routing_presets.py +105 -0
- switchyard/lib/profiles/deterministic_routing_profile_config.py +202 -0
- switchyard/lib/profiles/header_routing.py +93 -0
- switchyard/lib/profiles/latency_service.py +36 -0
- switchyard/lib/profiles/loader.py +192 -0
- switchyard/lib/profiles/noop.py +241 -0
- switchyard/lib/profiles/oss_router.py +138 -0
- switchyard/lib/profiles/passthrough.py +43 -0
- switchyard/lib/profiles/plan_execute.py +87 -0
- switchyard/lib/profiles/plan_execute_config.py +94 -0
- switchyard/lib/profiles/plan_execute_presets.py +98 -0
- switchyard/lib/profiles/protocols.py +116 -0
- switchyard/lib/profiles/random_routing.py +123 -0
- switchyard/lib/profiles/random_routing_presets.py +430 -0
- switchyard/lib/profiles/routellm.py +119 -0
- switchyard/lib/profiles/switchyard_adapter.py +87 -0
- switchyard/lib/profiles/table.py +149 -0
- switchyard/lib/profiles/translate_profile_config.py +79 -0
- switchyard/lib/prometheus_exposition.py +216 -0
- switchyard/lib/proxy_context.py +81 -0
- switchyard/lib/request_metadata.py +83 -0
- switchyard/lib/roles.py +47 -0
- switchyard/lib/route_table.py +171 -0
- switchyard/lib/route_table_builders.py +564 -0
- switchyard/lib/session_affinity.py +91 -0
- switchyard/lib/session_cache.py +13 -0
- switchyard/lib/session_key.py +14 -0
- switchyard/lib/stats_accumulator.py +8 -0
- switchyard/lib/switchyard.py +10 -0
- switchyard/lib/tracing.py +72 -0
- switchyard/server/__init__.py +34 -0
- switchyard/server/server_util.py +389 -0
- switchyard/server/shell_tui.py +419 -0
- switchyard/server/switchyard_app.py +214 -0
- switchyard/server/verify.py +1340 -0
- switchyard/telemetry.py +64 -0
- switchyard_rust/__init__.py +173 -0
- switchyard_rust/_switchyard_rust.pyd +0 -0
- switchyard_rust/components.py +90 -0
- switchyard_rust/components.pyi +381 -0
- switchyard_rust/core.py +851 -0
- switchyard_rust/profiles.py +36 -0
- switchyard_rust/profiles.pyi +66 -0
- switchyard_rust/py.typed +1 -0
- switchyard_rust/server.py +20 -0
- switchyard_rust/translation.py +482 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nemo-switchyard
|
|
3
|
+
Version: 0.0.1.dev1
|
|
4
|
+
Classifier: Development Status :: 3 - Alpha
|
|
5
|
+
Classifier: Intended Audience :: Developers
|
|
6
|
+
Classifier: Operating System :: OS Independent
|
|
7
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
8
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
11
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
12
|
+
Requires-Dist: openai>=2.34.0,<3.0
|
|
13
|
+
Requires-Dist: anthropic>=0.99.0,<1.0
|
|
14
|
+
Requires-Dist: httpx>=0.28.1,<1.0
|
|
15
|
+
Requires-Dist: pydantic>=2.13.3,<3.0
|
|
16
|
+
Requires-Dist: nemo-switchyard[server,cli,gpu,tracing,intake] ; extra == 'all'
|
|
17
|
+
Requires-Dist: prompt-toolkit>=3.0.52,<4.0 ; extra == 'cli'
|
|
18
|
+
Requires-Dist: routellm[serve]>=0.2.0,<1.0 ; extra == 'gpu'
|
|
19
|
+
Requires-Dist: transformers>=5.8.0 ; extra == 'gpu'
|
|
20
|
+
Requires-Dist: nemo-platform>=0.1.0,<1.0 ; extra == 'intake'
|
|
21
|
+
Requires-Dist: fastapi>=0.136.1,<1.0 ; extra == 'server'
|
|
22
|
+
Requires-Dist: uvicorn[standard]>=0.46.0,<1.0 ; extra == 'server'
|
|
23
|
+
Requires-Dist: sse-starlette>=3.4.1,<4.0 ; extra == 'server'
|
|
24
|
+
Requires-Dist: ddtrace>=2.9,<4 ; extra == 'tracing'
|
|
25
|
+
Provides-Extra: all
|
|
26
|
+
Provides-Extra: cli
|
|
27
|
+
Provides-Extra: gpu
|
|
28
|
+
Provides-Extra: intake
|
|
29
|
+
Provides-Extra: server
|
|
30
|
+
Provides-Extra: tracing
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
License-File: NOTICE
|
|
33
|
+
Summary: Typed, composable LLM routing with request/response translation and multi-backend orchestration
|
|
34
|
+
Keywords: llm,switchyard,routing,routellm,openai,nemo
|
|
35
|
+
Author: NVIDIA Corporation
|
|
36
|
+
Maintainer: NVIDIA Corporation
|
|
37
|
+
License-Expression: Apache-2.0
|
|
38
|
+
Requires-Python: >=3.12
|
|
39
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
40
|
+
Project-URL: Homepage, https://github.com/NVIDIA-dev/switchyard
|
|
41
|
+
Project-URL: Issues, https://github.com/NVIDIA-dev/switchyard/issues
|
|
42
|
+
Project-URL: Repository, https://github.com/NVIDIA-dev/switchyard
|
|
43
|
+
|
|
44
|
+
<p align="center">
|
|
45
|
+
<img src="assets/logo.png" alt="Switchyard" width="800">
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
# Switchyard
|
|
49
|
+
|
|
50
|
+
Typed, composable LLM routing and format translation for Python. Route traffic between multiple LLM providers, translate between OpenAI and Anthropic APIs, collect usage statistics, and build profile-backed routing flows with strong typing and minimal boilerplate.
|
|
51
|
+
|
|
52
|
+
**Why Switchyard?** Point coding agents like **Claude Code** and **Codex** at compatible open-source models. Switchyard transparently translates between OpenAI Chat, Anthropic Messages, and OpenAI Responses formats, so each agent keeps speaking its native API while requests are served by vLLM, NVIDIA NIM, Ollama, or any OpenAI-compatible endpoint. The same proxy can also **route across multiple models** for A/B benchmarking splits, signal-driven cascade escalation, or a custom router you wire in.
|
|
53
|
+
|
|
54
|
+
**Launcher routing is explicit**: launchers default to built-in LLM-classifier routing, which you can tune with `--weak-model`, `--classifier-model`, `--profile`, and `--classifier-min-confidence`; use `--model X` for single-model passthrough. The deprecated `--routing-profiles FILE` path remains for launcher-owned legacy bundles.
|
|
55
|
+
|
|
56
|
+
## Features
|
|
57
|
+
|
|
58
|
+
- **Protocol Translation**: convert between OpenAI Chat, Anthropic Messages, and OpenAI Responses formats
|
|
59
|
+
- **Multi-Backend Routing**: random routing, LLM-as-classifier routing, signal-driven cascade, or custom routers
|
|
60
|
+
- **Strong Types**: typed request/response containers for OpenAI, Anthropic, and Responses APIs
|
|
61
|
+
- **Profile-Owned Routing**: typed profiles own routing, backend calls, stats, and translation wiring
|
|
62
|
+
- **One-Command Launchers**: `switchyard launch claude`, `switchyard launch codex`, and `switchyard launch openclaw` spin up a local proxy and drop you into the target CLI
|
|
63
|
+
- **Request Statistics**: collect per-request latency, token, and cost data
|
|
64
|
+
|
|
65
|
+
## Quick Start
|
|
66
|
+
|
|
67
|
+
### Install from PyPI
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pip install "nemo-switchyard[cli,server]"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Install from source for local use (requires uv)
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git clone git@github.com:NVIDIA-NeMo/Switchyard.git
|
|
77
|
+
cd Switchyard
|
|
78
|
+
uv tool install --editable '.[server,cli]'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Install from source for contributors (requires uv)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
git clone git@github.com:NVIDIA-NeMo/Switchyard.git
|
|
85
|
+
cd Switchyard
|
|
86
|
+
uv sync
|
|
87
|
+
uv run switchyard ...
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 1. Launch Claude Code, Codex, or OpenClaw through Switchyard
|
|
91
|
+
|
|
92
|
+
Create an OpenRouter account at [openrouter.ai](https://openrouter.ai/) and
|
|
93
|
+
generate an API key from the [OpenRouter keys page](https://openrouter.ai/keys),
|
|
94
|
+
then export it:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
export OPENROUTER_API_KEY="your-openrouter-key" # pragma: allowlist secret
|
|
98
|
+
export OPENROUTER_BASE_URL="https://openrouter.ai/api/v1"
|
|
99
|
+
switchyard launch claude --model openai/gpt-4o-mini --api-key "$OPENROUTER_API_KEY" --base-url "$OPENROUTER_BASE_URL"
|
|
100
|
+
switchyard launch codex --model openai/gpt-4o-mini --api-key "$OPENROUTER_API_KEY" --base-url "$OPENROUTER_BASE_URL"
|
|
101
|
+
switchyard launch openclaw --model openai/gpt-4o-mini --api-key "$OPENROUTER_API_KEY" --base-url "$OPENROUTER_BASE_URL"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Each launcher starts a local proxy, points the agent at it, and shuts the proxy
|
|
105
|
+
down when the agent exits. Use `--model` for single-model passthrough. The
|
|
106
|
+
deprecated `--routing-profiles` flag remains for launcher-owned legacy bundles:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
switchyard launch claude --model openai/gpt-4o-mini --base-url https://openrouter.ai/api/v1 # single-model passthrough
|
|
110
|
+
switchyard --routing-profiles routes.yaml -- launch claude # legacy route bundle
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
> **Bedrock-backed profile caveat (Claude Code + MCP):** Bedrock enforces a 64-character `toolSpec.name` cap. Claude Code's MCP bridge can auto-inject longer tool names, producing `BedrockException` 400s on tool-bearing requests. If you use a Bedrock-backed route and hit this, swap to an OpenAI-compatible model with `--model openai/gpt-4o` or a routing-profile YAML.
|
|
114
|
+
|
|
115
|
+
See [Agent Launchers](docs/guides/agent_launchers.md) for supported harness
|
|
116
|
+
versions, model requirements, troubleshooting, and Claude Code `/model` picker
|
|
117
|
+
aliasing.
|
|
118
|
+
|
|
119
|
+
### 2. Run a standalone profile-config server
|
|
120
|
+
|
|
121
|
+
New standalone deployments use a profile config that separates provider
|
|
122
|
+
connectivity, upstream targets, and client-facing profiles. A complete
|
|
123
|
+
OpenRouter-backed random-routing config looks like this:
|
|
124
|
+
|
|
125
|
+
```yaml
|
|
126
|
+
endpoints:
|
|
127
|
+
openrouter:
|
|
128
|
+
api_key: ${OPENROUTER_API_KEY}
|
|
129
|
+
base_url: https://openrouter.ai/api/v1
|
|
130
|
+
|
|
131
|
+
targets:
|
|
132
|
+
strong:
|
|
133
|
+
endpoint: openrouter
|
|
134
|
+
model: openai/gpt-4o
|
|
135
|
+
format: openai
|
|
136
|
+
weak:
|
|
137
|
+
endpoint: openrouter
|
|
138
|
+
model: openai/gpt-4o-mini
|
|
139
|
+
format: openai
|
|
140
|
+
|
|
141
|
+
profiles:
|
|
142
|
+
smart:
|
|
143
|
+
type: random-routing
|
|
144
|
+
strong: strong
|
|
145
|
+
weak: weak
|
|
146
|
+
strong_probability: 0.3
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Serve it as a proxy. The `smart` profile and both target ids are exposed as
|
|
150
|
+
models; clients select one through the request's `model` field:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
switchyard serve --config profiles.yaml --port 4000
|
|
154
|
+
curl http://localhost:4000/v1/models
|
|
155
|
+
curl http://localhost:4000/v1/chat/completions \
|
|
156
|
+
-H "Content-Type: application/json" \
|
|
157
|
+
-d '{"model": "smart", "messages": [{"role": "user", "content": "hi"}]}'
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
> **Launcher compatibility:** Launcher subcommands do not accept `--config`.
|
|
161
|
+
> The deprecated `--routing-profiles` flag remains for launcher-owned legacy
|
|
162
|
+
> `routes:` bundles and saved bundle paths:
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
routes:
|
|
166
|
+
fast:
|
|
167
|
+
type: model
|
|
168
|
+
target: openai/gpt-4o-mini
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
switchyard --routing-profiles routes.yaml -- launch claude
|
|
173
|
+
switchyard --routing-profiles routes.yaml -- configure
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
For profile selection and full configuration examples, start with
|
|
177
|
+
[Routing Overview](docs/routing_algorithms/overview.md), then open the
|
|
178
|
+
strategy-specific page:
|
|
179
|
+
|
|
180
|
+
- [Random Routing](docs/routing_algorithms/random_routing.md)
|
|
181
|
+
- [LLM Classifier Routing](docs/routing_algorithms/llm_classifier_routing.md)
|
|
182
|
+
- [Cascade Routing](docs/routing_algorithms/cascade_routing.md)
|
|
183
|
+
|
|
184
|
+
For multi-turn classifier sessions, see
|
|
185
|
+
[Session Affinity (Sticky Routing)](docs/routing_algorithms/sticky_routing.md).
|
|
186
|
+
|
|
187
|
+
### 3. Use as a Python library
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
import asyncio
|
|
191
|
+
|
|
192
|
+
from switchyard import ChatRequest, PassthroughProfileConfig, ProfileSwitchyard
|
|
193
|
+
|
|
194
|
+
switchyard = ProfileSwitchyard(PassthroughProfileConfig(
|
|
195
|
+
api_key="sk-...",
|
|
196
|
+
base_url="https://api.openai.com/v1",
|
|
197
|
+
).build())
|
|
198
|
+
|
|
199
|
+
async def main():
|
|
200
|
+
request = ChatRequest.openai_chat({
|
|
201
|
+
"model": "gpt-4o",
|
|
202
|
+
"messages": [{"role": "user", "content": "What is 2+2?"}],
|
|
203
|
+
})
|
|
204
|
+
response = await switchyard.call(request)
|
|
205
|
+
# call() returns a JSON-compatible dict in the OpenAI Chat Completions shape.
|
|
206
|
+
print(response["choices"][0]["message"]["content"])
|
|
207
|
+
|
|
208
|
+
asyncio.run(main())
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Architecture
|
|
212
|
+
|
|
213
|
+
Switchyard sits between client applications and one or more LLM backends:
|
|
214
|
+
|
|
215
|
+
```text
|
|
216
|
+
clients --> Switchyard --> model backends
|
|
217
|
+
+--------> routing, translation, and fallback
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Clients keep their supported OpenAI or Anthropic API format while Switchyard
|
|
221
|
+
selects a configured model endpoint and translates the response back to the
|
|
222
|
+
expected shape. See [Architecture](docs/architecture.md) for system context and
|
|
223
|
+
the end-to-end request flow.
|
|
224
|
+
|
|
225
|
+
## Installation Options
|
|
226
|
+
|
|
227
|
+
Install from PyPI:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
pip install nemo-switchyard
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Optional extras:
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
pip install "nemo-switchyard[server]" # FastAPI / Uvicorn HTTP endpoints
|
|
237
|
+
pip install "nemo-switchyard[cli]" # Interactive CLI launchers (Claude / Codex)
|
|
238
|
+
pip install "nemo-switchyard[all]" # Server, CLI, GPU routing, and tracing extras
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
See [Installation](INSTALLATION.md) for a full breakdown of what each extra adds.
|
|
242
|
+
|
|
243
|
+
## Documentation
|
|
244
|
+
|
|
245
|
+
- **[Getting Started](docs/getting_started.md)**: step-by-step setup, first request, troubleshooting
|
|
246
|
+
- **[Known Issues](docs/known_issues.md)**: known issues in 0.1.0
|
|
247
|
+
- **[Agent Launchers](docs/guides/agent_launchers.md)**: Claude Code, Codex, and OpenClaw launcher behavior
|
|
248
|
+
- **[Cli Reference](docs/cli_reference.md)**: canonical reference for every `switchyard` subcommand and flag
|
|
249
|
+
- **[Architecture](docs/architecture.md)**: system context and end-to-end request flow
|
|
250
|
+
- **[Routing Algorithms](docs/routing_algorithms/)**: signal-driven weak/strong cascade routing: picker layers, signal dimensions, and calibration data.
|
|
251
|
+
- **[Contributing](CONTRIBUTING.md)**: dev setup, testing, CI gates, PR process
|
|
252
|
+
- **[Development](DEVELOPMENT.md)**: project structure, benchmarks, conventions
|
|
253
|
+
- **[Agents](AGENTS.md)**: full design philosophy and architectural patterns
|
|
254
|
+
|
|
255
|
+
## Supported Providers
|
|
256
|
+
|
|
257
|
+
- **OpenAI**: Chat Completions API
|
|
258
|
+
- **Anthropic**: Claude Messages API
|
|
259
|
+
- **OpenAI Responses API**: structured output / reasoning
|
|
260
|
+
- **OpenAI-compatible APIs**: vLLM, Ollama, Azure, etc. (anything with `/v1/chat/completions`)
|
|
261
|
+
|
|
262
|
+
## Requirements
|
|
263
|
+
|
|
264
|
+
- Python 3.12+
|
|
265
|
+
- macOS, Linux, or Windows
|
|
266
|
+
- API keys for your chosen backend (OpenAI, Anthropic, etc.)
|
|
267
|
+
- Linux x86_64 wheels require an x86-64-v3 / AVX2-class CPU (post 2013).
|
|
268
|
+
- Linux aarch64 wheels require a Neoverse N1-class CPU (post 2020).
|
|
269
|
+
|
|
270
|
+
## Community
|
|
271
|
+
|
|
272
|
+
- **Issues**: [GitHub Issues](https://github.com/NVIDIA-NeMo/Switchyard/issues)
|
|
273
|
+
- **Code of Conduct**: [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
274
|
+
- **Contributing**: [Contributing](CONTRIBUTING.md)
|
|
275
|
+
|
|
276
|
+
## License
|
|
277
|
+
|
|
278
|
+
[Apache 2.0 License](LICENSE). Copyright NVIDIA Corporation.
|
|
279
|
+
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
nemo_switchyard-0.0.1.dev1.dist-info\METADATA,sha256=pTHNyfi9BGuHg4cson2D2dMph0Bc1dOY69ZlLB_O6_E,11376
|
|
2
|
+
nemo_switchyard-0.0.1.dev1.dist-info\WHEEL,sha256=FDCxeh2p7wU8Ho3i9fQc9LZ-W3b0At4U5rtXgMygv9s,96
|
|
3
|
+
nemo_switchyard-0.0.1.dev1.dist-info\entry_points.txt,sha256=NDKZ25khT9tamyukBOVt0eZU5xPepZAfzNfJsbujUCk,64
|
|
4
|
+
nemo_switchyard-0.0.1.dev1.dist-info\licenses\LICENSE,sha256=OtoNzIJaHE1MSP1TTlfGohbrQLS31OalXayX3b5Hyac,11676
|
|
5
|
+
nemo_switchyard-0.0.1.dev1.dist-info\licenses\NOTICE,sha256=Oz8iNW4m4Jx1bWMQnSk6RXTZS2ZQiePE_0CmKVVbBxQ,1724
|
|
6
|
+
switchyard\__init__.py,sha256=1snxtO98urvKlvq2cxGsvdjWzlEu0PRP553cFbUy8gU,7364
|
|
7
|
+
switchyard\cli\__init__.py,sha256=DKUiNPiof85SXHGTxJQhoidDCotxOK1DhcJeJeC5jLQ,182
|
|
8
|
+
switchyard\cli\command_utils.py,sha256=K0rYd59ERqwLnieBAKGfpetpi4kT7_JM4boVkOd963w,2546
|
|
9
|
+
switchyard\cli\config\__init__.py,sha256=JJPXZVQUkRUfswzyFPLvcsFBFSt-zmqBh-JmiHc6xWM,188
|
|
10
|
+
switchyard\cli\config\user_config.py,sha256=OTNJA95NOc0QKDbRgv-pO9fwd8asHHwRR3Bua8mskPc,24413
|
|
11
|
+
switchyard\cli\configure_command.py,sha256=8pNaZtQCmDC4eU7U4TwjYGuJicm05jVbqPwWYSJGnl0,23808
|
|
12
|
+
switchyard\cli\intake_cli_config.py,sha256=p8lEqgA8IaIl-J9Ps7jUwM3ugqQUevpCJfq3QbAXltE,3802
|
|
13
|
+
switchyard\cli\launch_command.py,sha256=1nMqTWoB4AJvXjJX0z5nYgHpjzfaoItWjrBLeGyjigc,43166
|
|
14
|
+
switchyard\cli\launchers\__init__.py,sha256=DQX4esPII8vcFMPr0NfzcixQTmuDmkoF6k8X4nk-LVw,206
|
|
15
|
+
switchyard\cli\launchers\claude_alias.py,sha256=fLSDrHqBZ5jBgvAxGE9dgnB7Og0_n7hdYx92eljHuPU,1505
|
|
16
|
+
switchyard\cli\launchers\claude_code_launcher.py,sha256=CULOBvc5XETlCbINxpKYZ3qWFD994EKscRQcMLG-eUY,20658
|
|
17
|
+
switchyard\cli\launchers\codex_cli_launcher.py,sha256=Yb2kEPXsyijcPKGv4PvYO3Av9g_G8dGF0s7UoyxVfh4,24133
|
|
18
|
+
switchyard\cli\launchers\codex_model_catalog.py,sha256=dNqcEzoWeoXNeiHHmJSrf46OD0PrP_pl3tvtddEFQvo,5854
|
|
19
|
+
switchyard\cli\launchers\launch_intake_config.py,sha256=lnTGFcUXsHwzIrxBQLDL0q-Mw3AX5kw9lEpouHMcU2A,7653
|
|
20
|
+
switchyard\cli\launchers\launcher_runtime.py,sha256=gS1exCSx0LIuUCu6e28VnOiAXk7eMFX1a8D1Q0HzzR8,16262
|
|
21
|
+
switchyard\cli\launchers\live_stats_footer.py,sha256=VREEN3LkYItxzLULBWpBVRAOqIZv1dY2hbeD3sxQxjY,5795
|
|
22
|
+
switchyard\cli\launchers\openclaw_launcher.py,sha256=g3x0q-bc1k4gNYZF3vasHXAUu7KWP83MXhvmes398pw,27157
|
|
23
|
+
switchyard\cli\launchers\proxy_health_monitor.py,sha256=W9pX4ehHiF5i13MC-O0N0ythW9dj8NeU1sXSQ9D4gLY,1501
|
|
24
|
+
switchyard\cli\launchers\session_summary.py,sha256=tmxdd-RN52RVzO-TULij2Wx9nkMnCbYThnbzvglYxxs,3213
|
|
25
|
+
switchyard\cli\model_catalog\__init__.py,sha256=5Fj5Mw7rDwvpj8AsAJYWHMiygzI2n0LgQE9B6kBmseU,197
|
|
26
|
+
switchyard\cli\model_catalog\model_discovery.py,sha256=5xKfIE26XG5hx0shJPp8N9gJdUv3PvWnZJAbNxBnLL4,7906
|
|
27
|
+
switchyard\cli\models.py,sha256=p69OmELAbUgI38VYpRMw4Ql-70PT0s4CUHd7xwXRP5g,2216
|
|
28
|
+
switchyard\cli\output.py,sha256=jwNoe79qtA4_uchb31KQzzN_1VIleB6BtStedLXLyI4,6267
|
|
29
|
+
switchyard\cli\route_bundle.py,sha256=vBcvurxz3xE8wZuKBM1gwu4z59ThWmvss7CFbewB-M0,56010
|
|
30
|
+
switchyard\cli\routing\__init__.py,sha256=w_xT8LY-6UYGZaQcklQFKdwGK8IMPtJ2RBqdyKw68lg,598
|
|
31
|
+
switchyard\cli\routing\route_builder.py,sha256=OYXg0oVzVVTS61I5U-8G9T9tqfNY5vLzBpZ0tADe8Kw,10767
|
|
32
|
+
switchyard\cli\status.py,sha256=43bv4NjRwD53k8MPYSx6LkFDPnYFp0_aO57sIPnmkuY,7164
|
|
33
|
+
switchyard\cli\switchyard_cli.py,sha256=3VaCCLBmZ2SYkrEYEvBrwJPCRKW0QXEYWHKeqiuIN8Q,56342
|
|
34
|
+
switchyard\cli\tui\__init__.py,sha256=LEr5UGrzzhpvWc1NaFj8n5EvdgcOMk5_5eJIwS4RuEc,875
|
|
35
|
+
switchyard\cli\tui\choice_selector.py,sha256=3aW1MYD2VBZTVSrHI7ClK1e7sxACuDPzL0gWqT51zy0,1706
|
|
36
|
+
switchyard\cli\tui\launch_config_wizard.py,sha256=KnWZL06bJUYcxGmGUGexflQe4gy2j6KaHG9JUsfZWFY,3572
|
|
37
|
+
switchyard\cli\tui\model_selector.py,sha256=KxxKF1uPkIC805mL0jycdvPNULI5OZOWRcgHqaADoY0,9426
|
|
38
|
+
switchyard\cli\tui\terminal_capabilities.py,sha256=tMtAgazKZ3UFrb4iUXHXu_HjWPOZsi6IUyC4IwywH5o,2356
|
|
39
|
+
switchyard\cli\tui\tui_session.py,sha256=DYOGbT2SdWEc6M_Ne19yycuklRXSwZnfETEJHnt3D2k,3597
|
|
40
|
+
switchyard\lib\__init__.py,sha256=wvI7zEhe5MAzsr4JMrz7QsYYrzPYMcTcLieIfvk2dEE,909
|
|
41
|
+
switchyard\lib\backends\__init__.py,sha256=jgXl03a5kckwLmnMAS3kLetMFyMFcBBOIL7MAcSpTEs,1239
|
|
42
|
+
switchyard\lib\backends\anthropic_cache_breakpoint_backend.py,sha256=7EgaXhHzedc3CRqFGy7hwhc40b7bl_PZZ3hgwwHBaxI,10807
|
|
43
|
+
switchyard\lib\backends\anthropic_native_llm_backend.py,sha256=OUwYhQAR-l2uTbVCcBLwSoJHhYlXoB2ddyA9MJKpkz4,297
|
|
44
|
+
switchyard\lib\backends\backend_format_resolver.py,sha256=PPBA2WbDMWie8AtqqG-J_pRMJ4PSP7emQEjDzkQm-vs,14376
|
|
45
|
+
switchyard\lib\backends\deterministic_routing_llm_backend.py,sha256=YTcZmanYybd0lDufY49DPdVOdJFMhfTrdGsRqxS6ef0,6251
|
|
46
|
+
switchyard\lib\backends\health_poller.py,sha256=-7ErR_D2L4RQYW0h9JqtITphw5NI-b7El2AIvnfLF_A,7241
|
|
47
|
+
switchyard\lib\backends\latency_service_llm_backend.py,sha256=GPgKfYCDeYU7K2SLWOc5wfQrCUE6u8S6eEZr2E7JbS4,36210
|
|
48
|
+
switchyard\lib\backends\llm_target.py,sha256=SgIJxB59rLsZh8IvMv058LlbJm_EpUGhShXt1a5taZ4,3557
|
|
49
|
+
switchyard\lib\backends\multi_llm_backend.py,sha256=tXdQRGDu6iG3CZwTui6I4NPhlCGcnWx1j6SXflUfiTI,2897
|
|
50
|
+
switchyard\lib\backends\openai_llm_backend.py,sha256=rT8heawWR64NyY2OpmA9XUW92o54S4VXOxPKVhhxEGE,330
|
|
51
|
+
switchyard\lib\backends\openai_native_backend.py,sha256=h0WzOmXHxwpIVMI5-eTfG7a2E4HvQhrTaVE6t0_Fc-0,288
|
|
52
|
+
switchyard\lib\backends\stats_llm_backend.py,sha256=HR5i02U0XJEzr8P0E4vZTPPpQ8P7V9cQuotSOwwif-c,280
|
|
53
|
+
switchyard\lib\chat_request\__init__.py,sha256=H7EO32WYIzXFMKUzObQgmdYxOnR6kirvPzKThI8YhVU,647
|
|
54
|
+
switchyard\lib\chat_request\anthropic.py,sha256=AdW13QHDVmYFCunR7SPRtLe0Gx1gE2J6W6Pm3fkvu7U,380
|
|
55
|
+
switchyard\lib\chat_request\base.py,sha256=ZuOzcQTJgb6pQesvg7yK7Q8QuT7hW0v1uQDdTw5Ziyw,505
|
|
56
|
+
switchyard\lib\chat_request\openai_chat.py,sha256=zqXjFKCyuxFeBMc0ORJGhqA1Wx8r97SYcmgtvmCIcYI,379
|
|
57
|
+
switchyard\lib\chat_request\openai_responses.py,sha256=LwTpcb1rGHZEC2WwcNKze79vpV-5VxFhCNL_1YGwhPU,382
|
|
58
|
+
switchyard\lib\chat_response\__init__.py,sha256=y2tZcDYeA5wMYtC2XrA4F7wweI393-kkiGOmIrl-yXU,1179
|
|
59
|
+
switchyard\lib\chat_response\anthropic.py,sha256=eJhUFt6yqXJVa3sT00pzySe3W8qQ5RjwxYZowRU2QxE,659
|
|
60
|
+
switchyard\lib\chat_response\base.py,sha256=SQtPwK0at6xLrWWMWNdYDmR08E2jP-SaYVHiqDEP8L0,516
|
|
61
|
+
switchyard\lib\chat_response\openai_chat.py,sha256=l1HWYpjhMDcb2BFZ69qUvR88vi64WuRrLSfIpc6v6oc,607
|
|
62
|
+
switchyard\lib\chat_response\openai_responses.py,sha256=Dx3jqOfbwMiv6hl6KImu9qShoQ92TIvACh5ekgouAUc,659
|
|
63
|
+
switchyard\lib\chat_response\streaming_response_accumulator.py,sha256=3xgGddvMnZMhOeQG4BKXOSbxsdd_SuU64Ed-PcwYK_o,28335
|
|
64
|
+
switchyard\lib\config\__init__.py,sha256=MkNlbqVS4_GS6Ro_x-uVaXVZmAe0LDH1Hj4pZc9pqhI,604
|
|
65
|
+
switchyard\lib\config\intake_sink_config.py,sha256=iGZskSawFnCSD8K_ODBLisxBDPfZz2qnlD2Ymkp4qDk,328
|
|
66
|
+
switchyard\lib\config\latency_service_backend_config.py,sha256=up7CxxrIEkQ1OkKSyAl5jFstEzS1pyfYGpUrlfpguz0,5854
|
|
67
|
+
switchyard\lib\conversation_turn.py,sha256=uMpIljdZXq06UNuzblUB-wdDsXCEaxOCe9p0i6ChV0M,2291
|
|
68
|
+
switchyard\lib\cost_estimator.py,sha256=FvmlnaZ7lcO6EjrKeyS7LBf4ulbMivPqdX11ra7QJtQ,19754
|
|
69
|
+
switchyard\lib\endpoints\__init__.py,sha256=9Ozkbnnx74efGzNxnbsTQQHBnwtEXN_nAvW3xVUb-zo,2060
|
|
70
|
+
switchyard\lib\endpoints\anthropic_messages_endpoint.py,sha256=dHGxVXQXy7nAIqlR764Ac_7pq9aZmfaet8-L_tEdz68,4873
|
|
71
|
+
switchyard\lib\endpoints\base.py,sha256=seHCzTjzJMYyoGdR-pFQpul6zDQbTwryuifcP9E8MKU,1238
|
|
72
|
+
switchyard\lib\endpoints\dispatch.py,sha256=XigpFWPe1F4U-KNVjprM_EAOo7ehcoUwiZ5qr0SUSjE,4008
|
|
73
|
+
switchyard\lib\endpoints\error_envelope.py,sha256=tp23WSF0TcxOSr8ZEEAqVp837XZbuzbnt5Vn4pI0ewU,4154
|
|
74
|
+
switchyard\lib\endpoints\models_endpoint.py,sha256=EzFQn9iOXOewbg9yvEjbCk5lZyjtK9aBx8bwogOl150,1506
|
|
75
|
+
switchyard\lib\endpoints\openai_chat_endpoint.py,sha256=crBSImEcTHyGWMeTtifT_DpXsgtmwBxrqMNukwmfuy0,4383
|
|
76
|
+
switchyard\lib\endpoints\outcome_metrics.py,sha256=xh3AI7cO_gUMpH61LJQtZse2w8mQl1iEzph54hF8Nqs,9742
|
|
77
|
+
switchyard\lib\endpoints\prometheus_emitter.py,sha256=agErjPLOLRD5FuiQ-X4vmHIn4zi5iGDQ9jmp-yVOBpI,2507
|
|
78
|
+
switchyard\lib\endpoints\responses_endpoint.py,sha256=_VHAihDM3Tq5sSJNEbpt6XFIwSxkD2xYvlzkpx2Fy64,3955
|
|
79
|
+
switchyard\lib\endpoints\sse_helpers.py,sha256=syHRAkyFwZAKxrcPCFXv5HRS8m19ZH48J-bTkB3Dez8,8278
|
|
80
|
+
switchyard\lib\endpoints\stats_endpoint.py,sha256=Pm1zqE9UOfDhnVmZW5Sb3eDXKU9JAwHACEJnxPdYAlQ,4419
|
|
81
|
+
switchyard\lib\endpoints\upstream_error.py,sha256=RJMyFNy-WGuX8uc1c2tASy0I4jS0N4LCj58QuVKbnYg,7075
|
|
82
|
+
switchyard\lib\endpoints\upstream_error_log.py,sha256=PIMR7A5dtVhJblVE85tybOYYPQUun9n7BfBZJfYfzM8,3470
|
|
83
|
+
switchyard\lib\live_stats_collector.py,sha256=sJoCNPdYbKGx0MafR68qqmn6e7DHr7593I0fLdCZ7EQ,10532
|
|
84
|
+
switchyard\lib\llm_client.py,sha256=1PnjsrWJMM26Gc4WLbfduxfhr7fKgcUC1eyxy0WBAGY,5392
|
|
85
|
+
switchyard\lib\model_listing.py,sha256=xLLUUfqrB9_WcfX442KaSPH1U-5P45DI3LPtFBilqIw,4141
|
|
86
|
+
switchyard\lib\plugin\__init__.py,sha256=cmoMWadjC2ZE69AaIfovmDQ1dxWkLmcwqS6x20NER3M,1144
|
|
87
|
+
switchyard\lib\plugin\plugin_client.py,sha256=7z0mwri5LiGnhrpcEfKxGeed4TyztJZ5hTVMRf-ofdE,18258
|
|
88
|
+
switchyard\lib\plugin\plugin_protocol.py,sha256=TP_e036X1hoqizkkUsS4WreYrHyVMtAyfQY7SQSWKjo,5882
|
|
89
|
+
switchyard\lib\processors\__init__.py,sha256=z8MXwFx_WLoJVsjiiwAwwxHXYqA3TqwNV_aF4HH9T-o,2290
|
|
90
|
+
switchyard\lib\processors\_structured_output.py,sha256=LvQCmIXlU212xGCPl_H5hRC4VGf-YpE8cN6tvW_MHTg,4386
|
|
91
|
+
switchyard\lib\processors\cascade\__init__.py,sha256=HfmwgTtspezZevi0gsxK8m14Nh19rS_nk_kEqXHCFFk,1145
|
|
92
|
+
switchyard\lib\processors\cascade\classifier.py,sha256=wgJ8WAFlv962W6wsJD9vYJopmZxqGB09OSf5tw4iOwY,10392
|
|
93
|
+
switchyard\lib\processors\cascade\decision_log.py,sha256=a9ci4bkzS0lcBqfH4etpljLpBkrrwxcF3iZ_Jwipmrg,1605
|
|
94
|
+
switchyard\lib\processors\cascade\dimensions.py,sha256=KMltGJpinv4fTXIpMl5AD0CD-tnAObA-tr14x42lvgs,3035
|
|
95
|
+
switchyard\lib\processors\cascade\picker.py,sha256=Ir-Ljlx_2c1rnwaApf2yAODszyQDas_Awt3woOiO91o,4819
|
|
96
|
+
switchyard\lib\processors\cascade\prompts\tier_classifier.md,sha256=BBn9sWLjGunSZxbw6OD-leMJHy78FEkhJRC1wrMn-jU,549
|
|
97
|
+
switchyard\lib\processors\cascade\scorer.py,sha256=xj12nRKysbvau6ZSash8gLI4uQwt8KVgR-Gk2qBZTw4,1998
|
|
98
|
+
switchyard\lib\processors\cascade_request_processor.py,sha256=UgRVbFVa4QbuMDaG2y9pailhcY9mmrVjaQshK6tWOCg,4747
|
|
99
|
+
switchyard\lib\processors\empty_tool_content_normalizer.py,sha256=sjtNnr2E26E7Y9I1bz5DShZUoFXtQD3bpKFU3PG4Fx0,3192
|
|
100
|
+
switchyard\lib\processors\fixed_tier_request_processor.py,sha256=v8IPGzVcxAXuSNF_vqj_pfvRFrgfuJHfHNWQDjxZqqg,2001
|
|
101
|
+
switchyard\lib\processors\format_translate.py,sha256=Rpb5WGmQQ4T9cmzSEaMFur0mX2eeeyGFeHzslcmjHJk,13010
|
|
102
|
+
switchyard\lib\processors\intake_client.py,sha256=fXFHt5Y6mnFbuMfUJZXHXzYH09oKaixoa44Vf1VQB4I,8515
|
|
103
|
+
switchyard\lib\processors\intake_payload_builder.py,sha256=T4JLumOuEew7qIEOdSbKR-FUKQZJbmJ-gGASz4x28rg,11248
|
|
104
|
+
switchyard\lib\processors\intake_request_processor.py,sha256=GpGhupWzVaEheZnoIyOrhrClPkSSJ6mMBPCbsTjpUpQ,297
|
|
105
|
+
switchyard\lib\processors\intake_response_processor.py,sha256=BgGGfwaj_xbobnkKbDryTqewz39L1_-XmIiO0yG_AHQ,300
|
|
106
|
+
switchyard\lib\processors\llm_classifier\__init__.py,sha256=vWZs6-Rvg3jBmeZtbu0gU4cGiqgvCSzS9I_3GOZ35wI,2576
|
|
107
|
+
switchyard\lib\processors\llm_classifier\presets.py,sha256=Ox3iLmY9RK4WSoqJAOnqxaLebm8VYzgQddgCOhe0qao,20828
|
|
108
|
+
switchyard\lib\processors\llm_classifier\request_processor.py,sha256=jJgtTxNJo4w4ZfJU7LPIAXlPktZPxiAgrbembA-nksI,28226
|
|
109
|
+
switchyard\lib\processors\llm_classifier\signals.py,sha256=qouNfqYclz8EHDFzJHqMZnyByH_M7CzbfP1xB6I1y1o,20587
|
|
110
|
+
switchyard\lib\processors\llm_classifier\tier_selector_request_processor.py,sha256=HjFd-it6qmzuvN5EVSQePh81YDEeDVYO52Ex1-PGZh4,14917
|
|
111
|
+
switchyard\lib\processors\model_rewrite_request_processor.py,sha256=OtyWghSr5hj1EB8Q9VhI5izK8F7XGpX71VF25xA9GUk,960
|
|
112
|
+
switchyard\lib\processors\plan_execute\__init__.py,sha256=w8XB3hmVngyfHYdQfD6s49YX6SBo4ajnaplUJRkMRdY,2660
|
|
113
|
+
switchyard\lib\processors\plan_execute\plan.py,sha256=CtYF92jdGJBAroFbYMl2Uy8ko79bWJl7jYtpGytBuL4,3628
|
|
114
|
+
switchyard\lib\processors\plan_execute\request_processor.py,sha256=g6w99bz2cvz42u9jhtpOwxCe5y4R1-11eF5MlC72Ql8,43296
|
|
115
|
+
switchyard\lib\processors\plugin_routing_request_processor.py,sha256=7WGhe5hz7uOlnYcoCMofPJ-kEAkD50WZfVzQ3JgEUHc,12160
|
|
116
|
+
switchyard\lib\processors\random_routing_request_processor.py,sha256=4UFEn26UZQk3M37PbhmYtliWgmp1z1mwJ5YtiMh9yRs,2189
|
|
117
|
+
switchyard\lib\processors\reasoning_effort_normalizer.py,sha256=lRk_dFTtstLFxDeZzz_3bJLaKWixLDHeVIw7yRkNFmM,2592
|
|
118
|
+
switchyard\lib\processors\reasoning_hint.py,sha256=-ttxKViJFRhQCSPWwggQaw6y6t8TKxA5zovJetJU9io,923
|
|
119
|
+
switchyard\lib\processors\rl_logging_request_processor.py,sha256=0irqyS0eyXW6ORrnDF1EBKuCsuaTATRiA6PW5bq8S4s,1976
|
|
120
|
+
switchyard\lib\processors\rl_logging_response_processor.py,sha256=R1ZsXrU9xSBvUOeuBHmjg30mbJ2NK7-PYJvecmdpdz8,7415
|
|
121
|
+
switchyard\lib\processors\routellm_request_processor.py,sha256=QAl2DeYQHpO_cmvy7zUtEBSfaXw9PrEauz4OuPYaLbw,8043
|
|
122
|
+
switchyard\lib\processors\stats_request_processor.py,sha256=wkzJioP8u3yrqOFyx2hlwAByBnGwO3skg9o9g6RFUo4,294
|
|
123
|
+
switchyard\lib\processors\stats_response_processor_accumulator.py,sha256=DrRDIJJTp6cppCX8xaum2bX_6vdzySDr99XHDY316jc,297
|
|
124
|
+
switchyard\lib\processors\stats_response_processor_live_collector.py,sha256=Th0GJJg0KDXlyVk_zvE_xXCXHiCDa5tv9QAUpry2xmo,11680
|
|
125
|
+
switchyard\lib\processors\turn_based_router_request_processor.py,sha256=Rsf36x3mAUUmMkomtTPS2GFaUDd-ejuLXmvspeAwO7w,9653
|
|
126
|
+
switchyard\lib\profiles\__init__.py,sha256=q-NTXYFZqYezjnKs3f38vowpcEPmeFNPUDJRt8S4Les,3291
|
|
127
|
+
switchyard\lib\profiles\cascade.py,sha256=avPH1zsHKJroCOSYrm6u79N21VsEQxQMkt1tAc2d2ZM,3557
|
|
128
|
+
switchyard\lib\profiles\cascade_config.py,sha256=H2M6c_m51YwEEWEJBsl9eiwQ6fN-WiDFI_v0ly0-6SE,3821
|
|
129
|
+
switchyard\lib\profiles\chain.py,sha256=zCvH7UJf30nWya5B5XHI_qXV4uZCqTF2OS2aQ1BZIFM,16138
|
|
130
|
+
switchyard\lib\profiles\deterministic_routing_config.py,sha256=pwyQfIXqKhQrjlUaQqQx6HptBuQLjWfeW4CqOYqyTSE,7498
|
|
131
|
+
switchyard\lib\profiles\deterministic_routing_presets.py,sha256=O3BT0WNsbdyFWSdpd86GpWJF98MD2tqOu3etr2QQBOw,3777
|
|
132
|
+
switchyard\lib\profiles\deterministic_routing_profile_config.py,sha256=r3Mn1UkyYPw6x8t-XH-q3PaM7ekH-aWE6X_Hls_5ves,7496
|
|
133
|
+
switchyard\lib\profiles\header_routing.py,sha256=-mviTFVlzM6atjvPFJ-Cgkcn3QcNBhbiZfFVTHKad10,3521
|
|
134
|
+
switchyard\lib\profiles\latency_service.py,sha256=qugTuquKvvYjhP0GY0rnoIjaZevfaI3X5hbnlS1QVc8,1212
|
|
135
|
+
switchyard\lib\profiles\loader.py,sha256=-JrGsdRZA3c_P8a97bevEAXqsuPFvY2vMvnKxrw_zQ4,7563
|
|
136
|
+
switchyard\lib\profiles\noop.py,sha256=pWkNizEUrLGaNnIody-o6oYIGSSaxUjpaFT-LaJDe1Q,8861
|
|
137
|
+
switchyard\lib\profiles\oss_router.py,sha256=u_MMVG9MlbqiOKoC-7AW4pZG6RqOt3e6o7RkKfdrAqg,5373
|
|
138
|
+
switchyard\lib\profiles\passthrough.py,sha256=D6NErbxzS6CVh6qNDtTsyBNroJP-RTIAmF_dsQ2786E,1460
|
|
139
|
+
switchyard\lib\profiles\plan_execute.py,sha256=VEJrrIzIEWoXdhg3PpBLRywGjnEs1lzJGXtogjhVi_4,3303
|
|
140
|
+
switchyard\lib\profiles\plan_execute_config.py,sha256=Bed2LKrN9TIwt8QISw9R2xHy8TqcpmB3RhVVzpGblr4,4350
|
|
141
|
+
switchyard\lib\profiles\plan_execute_presets.py,sha256=XovY8ew9v4Y0bFEejPw_vi95C84BW2udAxfKYSelPEc,3847
|
|
142
|
+
switchyard\lib\profiles\protocols.py,sha256=3Rw7W04Ywk7uL9HJLqSAlqvbjyQXWmHo_fBZs3rWsaw,3816
|
|
143
|
+
switchyard\lib\profiles\random_routing.py,sha256=KMzg5DCq6cO-1qMdR-ReXa7PdYiR_Qic0pqKbWXwlhs,4548
|
|
144
|
+
switchyard\lib\profiles\random_routing_presets.py,sha256=Pz2fVXvkKWlwcmtb0kyAsxpKdUq1VcoSk_GYV2LWtvk,16029
|
|
145
|
+
switchyard\lib\profiles\routellm.py,sha256=Y3zXdf6grbdc48gHGk5_x3aXXdKPYWRU8jZlfNpCiEI,4442
|
|
146
|
+
switchyard\lib\profiles\switchyard_adapter.py,sha256=DKUcMw-ZM2TI16cjY8UBNb4r_KI05XFsYGM0ELXC7I0,3535
|
|
147
|
+
switchyard\lib\profiles\table.py,sha256=peQyEU-RzmyfG2oUkLr2pKcHxaMZ9H0dPbBShD0Hbco,5799
|
|
148
|
+
switchyard\lib\profiles\translate_profile_config.py,sha256=6IQHKCI6NyJr_wLY_-eTTN_rxQFb77Ec8HxtaXFz6yA,2906
|
|
149
|
+
switchyard\lib\prometheus_exposition.py,sha256=N45v3xWAN62oU3DS0Ac5HfnFHudGydJ4BCzIy_zyfqI,7785
|
|
150
|
+
switchyard\lib\proxy_context.py,sha256=MWj319UlGzZtzkj3k5Aw9e6z0i_7Wf9xPAWDrjJ3FQU,3507
|
|
151
|
+
switchyard\lib\request_metadata.py,sha256=BDdW1FHN2FGbjrLGDh1Nix-3_5lgxyMbxbrh79BAerk,3253
|
|
152
|
+
switchyard\lib\roles.py,sha256=JzYKDPkOCjnofhegvrkcO0FQ2DfphEC6B6EiWko1R5o,1543
|
|
153
|
+
switchyard\lib\route_table.py,sha256=ZgtQ0xhilCMZqG9tDiaXNLYUQgprksrT7Pi9jbZYbsQ,6998
|
|
154
|
+
switchyard\lib\route_table_builders.py,sha256=MS9Jh5bMpmvwY5giTVHu7li2_u1i5jyj-wiT2FsCRJM,21037
|
|
155
|
+
switchyard\lib\session_affinity.py,sha256=dCgE055GHFtPy4WRqNh-KHWm6G6w9W15-O4ZvbGa388,3684
|
|
156
|
+
switchyard\lib\session_cache.py,sha256=mrLjX017KrGiqDWPiqOEte1tKrN3RC5t5eo-fTYIIss,420
|
|
157
|
+
switchyard\lib\session_key.py,sha256=mAup36l5gmtlvomcVBnTDmcQz0uyhywI7I6ub3CyIMk,488
|
|
158
|
+
switchyard\lib\stats_accumulator.py,sha256=4FpWsK8yGzlV_lhO7auFDv7gEvHARUFvkxh-dhWcSkA,278
|
|
159
|
+
switchyard\lib\switchyard.py,sha256=m0ojeNHABu6H7m427gLB622w3dV2OWx6ZgCzoSI8j6k,307
|
|
160
|
+
switchyard\lib\tracing.py,sha256=k_SFrI6FKCRUNNa6xn1Dq9m-jIm1RDxssN83CsfENF4,2570
|
|
161
|
+
switchyard\server\__init__.py,sha256=Xp7tIA5jwPjlo4ZRXdDA3_QvQoLMbcBg72gSEaOzu-k,849
|
|
162
|
+
switchyard\server\server_util.py,sha256=8-oaCbeECn8OLttoJibIYmnK02vSfjqXgDj847bYHUQ,14964
|
|
163
|
+
switchyard\server\shell_tui.py,sha256=b0sTPhzsPSTBgV35HAXam4kBbGerXI1uaenbJzUT9J8,17471
|
|
164
|
+
switchyard\server\switchyard_app.py,sha256=sbK3bELNYceoaGGdWEwdu2gJnqJ3h0Kvw9kzA84k43I,8723
|
|
165
|
+
switchyard\server\verify.py,sha256=ywW2iUVGe9WhFMimU7oYmiuqz8TaDR9aY3Mj_Ycx2cc,51149
|
|
166
|
+
switchyard\telemetry.py,sha256=r8-XMXrgvqIp6Jf2sLbgXDYPfyv-Ty6Bel1c7UKkR1w,2135
|
|
167
|
+
switchyard_rust\__init__.py,sha256=ni-kelz2meuVWJpsz0xJvWzZx8bg78nvOBdD8Kx1VJo,6912
|
|
168
|
+
switchyard_rust\_switchyard_rust.pyd,sha256=pMPqedI62qDEXglTkycZ745Gcje58jMYraxX4FAuEr8,8715264
|
|
169
|
+
switchyard_rust\components.py,sha256=bnrefjVpdaz0TbXwhC7SECvnNB8mfnZ118JkseNqLOc,2742
|
|
170
|
+
switchyard_rust\components.pyi,sha256=-IpKbi4mYv3KfyvCkGgFnGP1qTkMmOtRUxIUwkZhzKs,10898
|
|
171
|
+
switchyard_rust\core.py,sha256=cAFWOQ8ODan_OsaJNh-gnwpuUoJ0kO4GuKWZXtbf_ek,32771
|
|
172
|
+
switchyard_rust\profiles.py,sha256=21gHlayqazkK2Gp39w1wHdrC-nAmXem0BxRoowEDyDU,1183
|
|
173
|
+
switchyard_rust\profiles.pyi,sha256=_oCP2s9tLI1y1xJz7X9ro4sJHx4WuATFMP0Wj8GPv5g,2239
|
|
174
|
+
switchyard_rust\py.typed,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
|
|
175
|
+
switchyard_rust\server.py,sha256=EA2cvifozwmpbWEoYkJhVekmYyagXHkDUPyBO70Qhrs,614
|
|
176
|
+
switchyard_rust\translation.py,sha256=Nw1-WYeunk7xGqe_kmVkapTUzKVIYhdX-iv5cpj97Vc,17286
|
|
177
|
+
nemo_switchyard-0.0.1.dev1.dist-info\RECORD,,
|