nemo-switchyard 0.0.1.dev0__cp312-abi3-win_amd64.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 (177) hide show
  1. nemo_switchyard-0.0.1.dev0.dist-info/METADATA +279 -0
  2. nemo_switchyard-0.0.1.dev0.dist-info/RECORD +177 -0
  3. nemo_switchyard-0.0.1.dev0.dist-info/WHEEL +4 -0
  4. nemo_switchyard-0.0.1.dev0.dist-info/entry_points.txt +2 -0
  5. nemo_switchyard-0.0.1.dev0.dist-info/licenses/LICENSE +204 -0
  6. nemo_switchyard-0.0.1.dev0.dist-info/licenses/NOTICE +40 -0
  7. switchyard/__init__.py +243 -0
  8. switchyard/cli/__init__.py +5 -0
  9. switchyard/cli/command_utils.py +85 -0
  10. switchyard/cli/config/__init__.py +5 -0
  11. switchyard/cli/config/user_config.py +692 -0
  12. switchyard/cli/configure_command.py +614 -0
  13. switchyard/cli/intake_cli_config.py +117 -0
  14. switchyard/cli/launch_command.py +1121 -0
  15. switchyard/cli/launchers/__init__.py +5 -0
  16. switchyard/cli/launchers/claude_alias.py +43 -0
  17. switchyard/cli/launchers/claude_code_launcher.py +542 -0
  18. switchyard/cli/launchers/codex_cli_launcher.py +642 -0
  19. switchyard/cli/launchers/codex_model_catalog.py +160 -0
  20. switchyard/cli/launchers/launch_intake_config.py +211 -0
  21. switchyard/cli/launchers/launcher_runtime.py +444 -0
  22. switchyard/cli/launchers/live_stats_footer.py +156 -0
  23. switchyard/cli/launchers/openclaw_launcher.py +702 -0
  24. switchyard/cli/launchers/proxy_health_monitor.py +44 -0
  25. switchyard/cli/launchers/session_summary.py +84 -0
  26. switchyard/cli/model_catalog/__init__.py +5 -0
  27. switchyard/cli/model_catalog/model_discovery.py +233 -0
  28. switchyard/cli/models.py +79 -0
  29. switchyard/cli/output.py +171 -0
  30. switchyard/cli/route_bundle.py +1490 -0
  31. switchyard/cli/routing/__init__.py +20 -0
  32. switchyard/cli/routing/route_builder.py +289 -0
  33. switchyard/cli/status.py +213 -0
  34. switchyard/cli/switchyard_cli.py +1453 -0
  35. switchyard/cli/tui/__init__.py +29 -0
  36. switchyard/cli/tui/choice_selector.py +55 -0
  37. switchyard/cli/tui/launch_config_wizard.py +103 -0
  38. switchyard/cli/tui/model_selector.py +251 -0
  39. switchyard/cli/tui/terminal_capabilities.py +88 -0
  40. switchyard/cli/tui/tui_session.py +111 -0
  41. switchyard/lib/__init__.py +16 -0
  42. switchyard/lib/backends/__init__.py +42 -0
  43. switchyard/lib/backends/anthropic_cache_breakpoint_backend.py +264 -0
  44. switchyard/lib/backends/anthropic_native_llm_backend.py +8 -0
  45. switchyard/lib/backends/backend_format_resolver.py +392 -0
  46. switchyard/lib/backends/deterministic_routing_llm_backend.py +166 -0
  47. switchyard/lib/backends/health_poller.py +181 -0
  48. switchyard/lib/backends/latency_service_llm_backend.py +771 -0
  49. switchyard/lib/backends/llm_target.py +106 -0
  50. switchyard/lib/backends/multi_llm_backend.py +86 -0
  51. switchyard/lib/backends/openai_llm_backend.py +8 -0
  52. switchyard/lib/backends/openai_native_backend.py +8 -0
  53. switchyard/lib/backends/stats_llm_backend.py +8 -0
  54. switchyard/lib/chat_request/__init__.py +17 -0
  55. switchyard/lib/chat_request/anthropic.py +12 -0
  56. switchyard/lib/chat_request/base.py +14 -0
  57. switchyard/lib/chat_request/openai_chat.py +12 -0
  58. switchyard/lib/chat_request/openai_responses.py +12 -0
  59. switchyard/lib/chat_response/__init__.py +39 -0
  60. switchyard/lib/chat_response/anthropic.py +19 -0
  61. switchyard/lib/chat_response/base.py +14 -0
  62. switchyard/lib/chat_response/openai_chat.py +15 -0
  63. switchyard/lib/chat_response/openai_responses.py +19 -0
  64. switchyard/lib/chat_response/streaming_response_accumulator.py +752 -0
  65. switchyard/lib/config/__init__.py +20 -0
  66. switchyard/lib/config/intake_sink_config.py +8 -0
  67. switchyard/lib/config/latency_service_backend_config.py +121 -0
  68. switchyard/lib/conversation_turn.py +68 -0
  69. switchyard/lib/cost_estimator.py +441 -0
  70. switchyard/lib/endpoints/__init__.py +55 -0
  71. switchyard/lib/endpoints/anthropic_messages_endpoint.py +120 -0
  72. switchyard/lib/endpoints/base.py +39 -0
  73. switchyard/lib/endpoints/dispatch.py +111 -0
  74. switchyard/lib/endpoints/error_envelope.py +130 -0
  75. switchyard/lib/endpoints/models_endpoint.py +42 -0
  76. switchyard/lib/endpoints/openai_chat_endpoint.py +101 -0
  77. switchyard/lib/endpoints/outcome_metrics.py +249 -0
  78. switchyard/lib/endpoints/prometheus_emitter.py +71 -0
  79. switchyard/lib/endpoints/responses_endpoint.py +98 -0
  80. switchyard/lib/endpoints/sse_helpers.py +207 -0
  81. switchyard/lib/endpoints/stats_endpoint.py +113 -0
  82. switchyard/lib/endpoints/upstream_error.py +176 -0
  83. switchyard/lib/endpoints/upstream_error_log.py +81 -0
  84. switchyard/lib/live_stats_collector.py +268 -0
  85. switchyard/lib/llm_client.py +124 -0
  86. switchyard/lib/model_listing.py +131 -0
  87. switchyard/lib/plugin/__init__.py +43 -0
  88. switchyard/lib/plugin/plugin_client.py +461 -0
  89. switchyard/lib/plugin/plugin_protocol.py +166 -0
  90. switchyard/lib/processors/__init__.py +59 -0
  91. switchyard/lib/processors/_structured_output.py +124 -0
  92. switchyard/lib/processors/cascade/__init__.py +48 -0
  93. switchyard/lib/processors/cascade/classifier.py +249 -0
  94. switchyard/lib/processors/cascade/decision_log.py +43 -0
  95. switchyard/lib/processors/cascade/dimensions.py +78 -0
  96. switchyard/lib/processors/cascade/picker.py +142 -0
  97. switchyard/lib/processors/cascade/prompts/tier_classifier.md +5 -0
  98. switchyard/lib/processors/cascade/scorer.py +55 -0
  99. switchyard/lib/processors/cascade_request_processor.py +124 -0
  100. switchyard/lib/processors/empty_tool_content_normalizer.py +85 -0
  101. switchyard/lib/processors/fixed_tier_request_processor.py +55 -0
  102. switchyard/lib/processors/format_translate.py +312 -0
  103. switchyard/lib/processors/intake_client.py +230 -0
  104. switchyard/lib/processors/intake_payload_builder.py +301 -0
  105. switchyard/lib/processors/intake_request_processor.py +8 -0
  106. switchyard/lib/processors/intake_response_processor.py +8 -0
  107. switchyard/lib/processors/llm_classifier/__init__.py +88 -0
  108. switchyard/lib/processors/llm_classifier/presets.py +446 -0
  109. switchyard/lib/processors/llm_classifier/request_processor.py +660 -0
  110. switchyard/lib/processors/llm_classifier/signals.py +568 -0
  111. switchyard/lib/processors/llm_classifier/tier_selector_request_processor.py +362 -0
  112. switchyard/lib/processors/model_rewrite_request_processor.py +26 -0
  113. switchyard/lib/processors/plan_execute/__init__.py +72 -0
  114. switchyard/lib/processors/plan_execute/plan.py +86 -0
  115. switchyard/lib/processors/plan_execute/request_processor.py +1005 -0
  116. switchyard/lib/processors/plugin_routing_request_processor.py +319 -0
  117. switchyard/lib/processors/random_routing_request_processor.py +58 -0
  118. switchyard/lib/processors/reasoning_effort_normalizer.py +68 -0
  119. switchyard/lib/processors/reasoning_hint.py +23 -0
  120. switchyard/lib/processors/rl_logging_request_processor.py +43 -0
  121. switchyard/lib/processors/rl_logging_response_processor.py +187 -0
  122. switchyard/lib/processors/routellm_request_processor.py +195 -0
  123. switchyard/lib/processors/stats_request_processor.py +8 -0
  124. switchyard/lib/processors/stats_response_processor_accumulator.py +8 -0
  125. switchyard/lib/processors/stats_response_processor_live_collector.py +330 -0
  126. switchyard/lib/processors/turn_based_router_request_processor.py +238 -0
  127. switchyard/lib/profiles/__init__.py +97 -0
  128. switchyard/lib/profiles/cascade.py +100 -0
  129. switchyard/lib/profiles/cascade_config.py +84 -0
  130. switchyard/lib/profiles/chain.py +393 -0
  131. switchyard/lib/profiles/deterministic_routing_config.py +161 -0
  132. switchyard/lib/profiles/deterministic_routing_presets.py +105 -0
  133. switchyard/lib/profiles/deterministic_routing_profile_config.py +202 -0
  134. switchyard/lib/profiles/header_routing.py +93 -0
  135. switchyard/lib/profiles/latency_service.py +36 -0
  136. switchyard/lib/profiles/loader.py +192 -0
  137. switchyard/lib/profiles/noop.py +241 -0
  138. switchyard/lib/profiles/oss_router.py +138 -0
  139. switchyard/lib/profiles/passthrough.py +43 -0
  140. switchyard/lib/profiles/plan_execute.py +87 -0
  141. switchyard/lib/profiles/plan_execute_config.py +94 -0
  142. switchyard/lib/profiles/plan_execute_presets.py +98 -0
  143. switchyard/lib/profiles/protocols.py +116 -0
  144. switchyard/lib/profiles/random_routing.py +123 -0
  145. switchyard/lib/profiles/random_routing_presets.py +430 -0
  146. switchyard/lib/profiles/routellm.py +119 -0
  147. switchyard/lib/profiles/switchyard_adapter.py +87 -0
  148. switchyard/lib/profiles/table.py +149 -0
  149. switchyard/lib/profiles/translate_profile_config.py +79 -0
  150. switchyard/lib/prometheus_exposition.py +216 -0
  151. switchyard/lib/proxy_context.py +81 -0
  152. switchyard/lib/request_metadata.py +83 -0
  153. switchyard/lib/roles.py +47 -0
  154. switchyard/lib/route_table.py +171 -0
  155. switchyard/lib/route_table_builders.py +564 -0
  156. switchyard/lib/session_affinity.py +91 -0
  157. switchyard/lib/session_cache.py +13 -0
  158. switchyard/lib/session_key.py +14 -0
  159. switchyard/lib/stats_accumulator.py +8 -0
  160. switchyard/lib/switchyard.py +10 -0
  161. switchyard/lib/tracing.py +72 -0
  162. switchyard/server/__init__.py +34 -0
  163. switchyard/server/server_util.py +389 -0
  164. switchyard/server/shell_tui.py +419 -0
  165. switchyard/server/switchyard_app.py +214 -0
  166. switchyard/server/verify.py +1340 -0
  167. switchyard/telemetry.py +64 -0
  168. switchyard_rust/__init__.py +173 -0
  169. switchyard_rust/_switchyard_rust.pyd +0 -0
  170. switchyard_rust/components.py +90 -0
  171. switchyard_rust/components.pyi +381 -0
  172. switchyard_rust/core.py +851 -0
  173. switchyard_rust/profiles.py +36 -0
  174. switchyard_rust/profiles.pyi +66 -0
  175. switchyard_rust/py.typed +1 -0
  176. switchyard_rust/server.py +20 -0
  177. switchyard_rust/translation.py +482 -0
@@ -0,0 +1,279 @@
1
+ Metadata-Version: 2.4
2
+ Name: nemo-switchyard
3
+ Version: 0.0.1.dev0
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.dev0.dist-info\METADATA,sha256=qNsEKs-ad2y9t9Q4lslxNsBDl44L8UYQBNaTrwRkCAo,11376
2
+ nemo_switchyard-0.0.1.dev0.dist-info\WHEEL,sha256=G2SZIrJRwCxVBDP9gATjV0AEtDetnWY1Rd7up3g1FKk,96
3
+ nemo_switchyard-0.0.1.dev0.dist-info\entry_points.txt,sha256=NDKZ25khT9tamyukBOVt0eZU5xPepZAfzNfJsbujUCk,64
4
+ nemo_switchyard-0.0.1.dev0.dist-info\licenses\LICENSE,sha256=OtoNzIJaHE1MSP1TTlfGohbrQLS31OalXayX3b5Hyac,11676
5
+ nemo_switchyard-0.0.1.dev0.dist-info\licenses\NOTICE,sha256=Oz8iNW4m4Jx1bWMQnSk6RXTZS2ZQiePE_0CmKVVbBxQ,1724
6
+ switchyard\__init__.py,sha256=TjblkBfjE-2Inlj4dO2eujUKELP6643ugvkYetVRTlA,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=eCnxHpcVRZGiEtNsYC5CVLmyzrVYdcOpkBO291nKqKU,10332672
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.dev0.dist-info\RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: maturin (1.11.5)
3
+ Root-Is-Purelib: false
4
+ Tag: cp312-abi3-win_amd64
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ switchyard=switchyard.cli.switchyard_cli:main