Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package switchyard for openSUSE:Factory checked in at 2026-09-24 22:58:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/switchyard (Old) and /work/SRC/openSUSE:Factory/.switchyard.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "switchyard" Thu Sep 24 22:58:19 2026 rev:2 rq:1380106 version:0.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/switchyard/switchyard.changes 2026-08-18 16:36:23.073716653 +0200 +++ /work/SRC/openSUSE:Factory/.switchyard.new.383539/switchyard.changes 2026-09-24 23:00:55.956942234 +0200 @@ -1,0 +2,16 @@ +Thu Sep 24 06:15:25 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to version 0.3.0 (breaking upstream rework): + * Runner integrations, Advisor Gate and Composite routing, + Auto presets, new Rust/Python embedding APIs, provider + translation and tool-loop fixes + * Drops the legacy Python server, the switchyard console + script and its serve/launch commands: python-switchyard + is now the importable library only, without console + script or alternatives; the Recommends from the daemon + goes away with the documented CLI workflow + * Python runtime requirements drop to nothing (upstream + dependencies = []); the license closure re-derived + (224/233 crates, same seven identifiers) + +------------------------------------------------------------------- Old: ---- Switchyard-0.2.0.tar.zst New: ---- Switchyard-0.3.0.tar.zst ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ switchyard.spec ++++++ --- /var/tmp/diff_new_pack.PH4uOr/_old 2026-09-24 23:00:59.983110583 +0200 +++ /var/tmp/diff_new_pack.PH4uOr/_new 2026-09-24 23:00:59.985110667 +0200 @@ -18,7 +18,7 @@ %define python_subpackage_only 1 Name: switchyard -Version: 0.2.0 +Version: 0.3.0 Release: 0 Summary: Routing and translating proxy for LLM traffic # Legal-Review-Notice: the shipped binaries statically link their Rust @@ -28,7 +28,7 @@ # Method: vendor.tar.zst was extracted over the source and # cargo tree --offline -p <target> -e normal --prefix none \ # --target {x86_64,aarch64}-unknown-linux-gnu -# unioned to 222 crates for switchyard-server and 232 for switchyard-py (a +# unioned to 224 crates for switchyard-server and 233 for switchyard-py (a # strict superset); each was mapped to vendor/<name>-<version>/Cargo.toml and # its "license =" field read. # - No GPL/LGPL/AGPL/MPL/EPL/CDDL/CC-BY-SA/SSPL/OSL crate is in either closure. @@ -65,20 +65,12 @@ Source1: vendor.tar.zst Source2: %{name}.service Source3: system-user-%{name}.conf -BuildRequires: %{python_module PyYAML} -BuildRequires: %{python_module anthropic >= 0.99.0} -# requires-python = ">=3.12" -BuildRequires: %{python_module base >= 3.12} -BuildRequires: %{python_module fastapi >= 0.136.1} -BuildRequires: %{python_module httpx >= 0.28.1} +BuildRequires: %{python_module base >= 3.10} # Upstream's declared PEP 517 backend is maturin (>=1.9,<2.0); it is what places -# the abi3 cdylib as switchyard_rust/_switchyard_rust and emits the console -# script, so it is not an optional convenience here. +# the abi3 cdylib as switchyard_rust/_switchyard_rust, so it is not an +# optional convenience here. BuildRequires: %{python_module maturin >= 1.9} -BuildRequires: %{python_module openai >= 2.7} BuildRequires: %{python_module pip} -BuildRequires: %{python_module pydantic >= 2.13.3} -BuildRequires: %{python_module uvicorn >= 0.46.0} BuildRequires: %{python_module wheel} BuildRequires: ca-certificates-mozilla BuildRequires: cargo @@ -97,13 +89,6 @@ # rustls-platform-verifier reads the system trust store, refusing to build a # client when it is empty ("No CA certificates were loaded from the system"). Requires: ca-certificates-mozilla -# The daemon itself embeds no Python, and the CLI never execs the -# switchyard-server binary - it hosts the server in-process through the pyo3 -# binding - so the two halves do not require each other. But the workflow -# upstream documents is the `switchyard` command, so a default installation -# (zypper honours Recommends) must still get it; --no-recommends keeps a -# minimal proxy host free of the Python stack. -Recommends: python3-%{name} = %{version}-%{release} ExclusiveArch: %{rust_tier1_arches} %sysusers_requires %{?systemd_ordering} @@ -121,51 +106,26 @@ and signal-driven stage routing between a capable and an efficient target. This package ships the standalone proxy as %{_bindir}/switchyard-server -together with a systemd service. The user-facing %{_bindir}/switchyard command -and the importable Python library are in the python-switchyard subpackage. +together with a systemd service. The importable Python library is in +the python-switchyard subpackage. %package -n python-%{name} -Summary: Switchyard command-line client and Python library -# The wheel's metadata carries upstream's four base requirements (openai, -# anthropic, httpx, pydantic) and openSUSE's Python dependency generator turns -# those into versioned Requires by itself, so they are not repeated here. -# These three are not covered by it and are declared by hand: -# - fastapi and uvicorn live in upstream's optional "server" extra, but the -# console script imports switchyard.server.server_util at module level and -# both `switchyard serve` and `switchyard launch` serve over HTTP, so they -# are mandatory for everything this subpackage exists to do. -# - PyYAML is required and *undeclared upstream*: route bundles are YAML and -# switchyard/cli/route_bundle.py reaches it through import_module("yaml"), -# which no metadata scanner can see. -Requires: python-PyYAML -Requires: python-fastapi >= 0.136.1 -Requires: python-uvicorn >= 0.46.0 -Requires(post): update-alternatives -Requires(postun): update-alternatives +Summary: Switchyard Python library +# Upstream declares no runtime requirements at all (dependencies = []), +# and the shipped modules import nothing beyond the standard library +# and the compiled extension, so nothing is declared by hand either. # Upstream publishes this distribution to PyPI as nemo-switchyard while the # import name is switchyard; provide the distribution name so it is findable. Provides: python-nemo-switchyard = %{version}-%{release} -# Deliberately NOT required, contrary to upstream's own extras: -# - sse-starlette is listed in the "server" extra but nothing in the tree -# imports it; SSE is emitted through fastapi.responses.StreamingResponse. -# - prompt-toolkit is listed in the "cli" extra but the tree has zero -# prompt_toolkit references; the terminal UI is built on stdlib pty/termios. -# - ddtrace (tracing extra) is not in Factory at all, and redis (affinity-redis -# extra) is pinned <6 while Factory ships 7.0.1. Both are lazily imported -# behind feature checks that no-op when the module is absent, so neither -# blocks anything. -# - claude/codex/openclaw are launch targets, not dependencies: a missing -# binary exits with an install hint. %description -n python-%{name} Switchyard routes LLM traffic across providers and translates between the OpenAI Chat, Anthropic Messages and OpenAI Responses wire formats. -This package provides the %{_bindir}/switchyard command - the entry point for -the documented workflow, e.g. "switchyard launch claude --model switchyard", -which starts a routing proxy in-process and runs a coding agent through it - -and the importable switchyard and switchyard_rust Python modules, including the -compiled extension the library is built on. +This package provides the importable switchyard and switchyard_rust +Python modules, including the compiled extension the library is built +on. The 0.3.0 upstream removed the former switchyard console script +and its serve/launch commands. %prep %autosetup -n Switchyard-%{version} -p1 -a1 @@ -187,11 +147,6 @@ echo "ERROR: .cargo/ still carries rustflags that raise the ISA baseline" >&2 exit 1 fi -# The CLI entry point is reached through the generated console script, never run -# directly, so it is installed 0644 as the library module it is - but it carries -# a "#!/usr/bin/env python3" line, and rpmlint judges by the shebang -# (non-executable-script). Drop it before maturin copies the file into the wheel. -sed -i '1{/^#!.*python/d}' switchyard/cli/switchyard_cli.py %build export CARGO_NET_OFFLINE=true @@ -227,9 +182,6 @@ install -d -m 0750 %{buildroot}%{_sysconfdir}/%{name} %pyproject_install -# Every flavour installs the same %%{_bindir}/switchyard, so the console script -# goes through update-alternatives. -%python_clone -a %{buildroot}%{_bindir}/%{name} %python_expand %fdupes %{buildroot}%{$python_sitearch} # Apache-2.0 section 4(d) and the MIT/BSD/ISC notice clauses apply to the @@ -265,20 +217,16 @@ %{cargo_test} -p switchyard-server # Upstream's pytest suite needs unpackaged plugins (pytest-markdown-docs, respx) # and a git-only harbor dependency, so the Python side is covered by a smoke -# test instead. It has to assert more than "import switchyard": the library -# fails closed on a missing extension module, so import the cdylib explicitly -# and require the native translation path to report itself available; check the -# three data files that are read at import time or on the zero-config launch -# path; and finally run the console script this subpackage exists to ship. -# Two mechanics matter here. Each %%python_expand argument must be ONE physical -# line: the macro re-emits its argument per flavour, and a backslash-continued -# argument gets truncated at the first newline for every flavour but the last - -# which fails as a shell syntax error, not as a test failure. And $python needs -# -P, or sys.path[0] would be the current directory - the unbuilt source tree - -# which shadows the installed package the test is supposed to exercise. -%python_expand PYTHONPATH=%{buildroot}%{$python_sitearch} $python -P -B -c "import os, switchyard, switchyard_rust, switchyard_rust._switchyard_rust as native; d = os.path.dirname(switchyard.__file__); assert d.startswith('%{buildroot}'), d; assert switchyard_rust.is_native_translation_available(), 'native translation unavailable'; assert switchyard.__version__ == '%{version}', switchyard.__version__; assert os.path.isfile(d + '/cli/defaults/openrouter.toml'); assert os.path.isfile(d + '/lib/processors/prompts/escalation_judge.md'); assert os.path.isfile(d + '/lib/processors/stage_router/prompts/tier_classifier.md'); print('smoke ok:', switchyard.__version__, native.__file__)" -%python_expand PYTHONPATH=%{buildroot}%{$python_sitearch} %{buildroot}%{_bindir}/%{name}-%{$python_bin_suffix} --version -%python_expand PYTHONPATH=%{buildroot}%{$python_sitearch} %{buildroot}%{_bindir}/%{name}-%{$python_bin_suffix} --help +# test instead. It has to assert more than "import switchyard": import the +# libsy namespace too (it re-exports the compiled extension's classifiers), +# and require the version to match. Two mechanics matter here. Each +# %%python_expand argument must be ONE physical line: the macro re-emits its +# argument per flavour, and a backslash-continued argument gets truncated at +# the first newline for every flavour but the last - which fails as a shell +# syntax error, not as a test failure. And $python needs -P, or sys.path[0] +# would be the current directory - the unbuilt source tree - which shadows +# the installed package the test is supposed to exercise. +%python_expand PYTHONPATH=%{buildroot}%{$python_sitearch} $python -P -B -c "import os, switchyard, switchyard.libsy, switchyard_rust; d = os.path.dirname(switchyard.__file__); assert d.startswith('%{buildroot}'), d; assert switchyard.__version__ == '%{version}', switchyard.__version__; print('smoke ok:', switchyard.__version__)" %pre -f %{name}.pre %service_add_pre %{name}.service @@ -292,12 +240,6 @@ %postun %service_del_postun %{name}.service -%post -n python-%{name} -%python_install_alternative %{name} - -%postun -n python-%{name} -%python_uninstall_alternative %{name} - %files %license LICENSE NOTICE %license %{_defaultlicensedir}/%{name}/vendor @@ -315,7 +257,6 @@ %license LICENSE NOTICE %license %{_defaultlicensedir}/%{python_flavor}-%{name}/vendor %doc README.md INSTALLATION.md -%python_alternative %{_bindir}/%{name} %{python_sitearch}/switchyard %{python_sitearch}/switchyard_rust %{python_sitearch}/nemo_switchyard-%{version}.dist-info ++++++ Switchyard-0.2.0.tar.zst -> Switchyard-0.3.0.tar.zst ++++++ ++++ 229411 lines of diff (skipped) ++++++ Switchyard.obsinfo ++++++ --- /var/tmp/diff_new_pack.PH4uOr/_old 2026-09-24 23:01:00.521133080 +0200 +++ /var/tmp/diff_new_pack.PH4uOr/_new 2026-09-24 23:01:00.526133289 +0200 @@ -1,5 +1,5 @@ name: Switchyard -version: 0.2.0 -mtime: 1786391515 -commit: 1fc9ab887d1c663b0048ae24d5f473d15ed8daaa +version: 0.3.0 +mtime: 1790099393 +commit: 336196f6fbfc97ddc71c1700f6092e564e9f23c2 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.PH4uOr/_old 2026-09-24 23:01:00.561134753 +0200 +++ /var/tmp/diff_new_pack.PH4uOr/_new 2026-09-24 23:01:00.567135004 +0200 @@ -2,7 +2,7 @@ <service name="obs_scm" mode="manual"> <param name="url">https://github.com/NVIDIA-NeMo/Switchyard.git</param> <param name="scm">git</param> - <param name="revision">refs/tags/v0.2.0</param> + <param name="revision">refs/tags/v0.3.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">disable</param> @@ -14,7 +14,7 @@ </service> <service name="set_version" mode="manual"/> <service name="cargo_vendor" mode="manual"> - <param name="src">Switchyard-0.2.0.tar.zst</param> + <param name="src">Switchyard-0.3.0.tar.zst</param> <param name="compression">zst</param> <param name="update">true</param> </service> ++++++ vendor.tar.zst ++++++ /work/SRC/openSUSE:Factory/switchyard/vendor.tar.zst /work/SRC/openSUSE:Factory/.switchyard.new.383539/vendor.tar.zst differ: char 7, line 1
