用途:当改动主要位于 python/nemo_relay、python/plugin、python/tests、crates/python 或面向 Python 的文档与示例时,使用本技能构建并测试 NeMo Relay 的 Python 绑定和 worker 插件 SDK。实现或评审时可配合 karpathy-guidelines,保持改动范围收敛、明确假设,并在编辑前定义聚焦的验证方式。
主要能力与用法:默认先用 uv run ruff format python python/plugin 格式化改动的 Python 包装与测试文件;已知受影响区域时先跑聚焦 pytest;Python worker SDK 变更时运行 just test-python-plugin;评审前用 just test-python 跑完整 Python 套件。若 Python 工作同时改动了 Rust 文件,还需运行 cargo fmt --all、just test-rust 和 cargo clippy --workspace --all-targets -- -D warnings。需要显式仅构建时用 just build-python;Python worker SDK 变更时用 just build-python-plugin;原生 Rust 桥接变更时补充 nemo-relay-python 的 Rust crate 测试,如 cargo test -p nemo-relay-python。
测试风格:使用 pytest;不要给测试加 @pytest.mark.asyncio,异步测试会被自动检测运行;不要给测试函数加 -> None 返回类型注解;mock 类时使用 unittest.mock.MagicMock 或 AsyncMock(必要时带 spec),mock 类名以 mock 前缀而非 fake;优先使用 pytest fixture 而非辅助方法,跨文件复用的 fixture 放入 conftest.py,fixture 命名遵循 @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) 模式,仅在非 function 作用域时指定 scope;不同输入类型优先用 pytest.mark.parametrize。
升级与限制:若改动涉及 crates/core、crates/adaptive 或共享运行时语义,还需使用 validate-change;若涉及 python/plugin 或 worker 协议行为,还需使用 maintain-dynamic-plugins;若仅为文档改动,优先使用 contribute-docs 加针对性命令检查。参考资料包括 pyproject.toml、crates/python/Cargo.toml、crates/python/README.md、python/nemo_relay/README.md、python/plugin/pyproject.toml、python/plugin/src/nemo_relay_plugin、python/tests/plugin 及相关文档。