feat(sdk-python): add PyPI release workflow#3685
Conversation
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Code Coverage Summary
CLI Package - Full Text ReportCore Package - Full Text ReportFor detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run. |
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
wenshao
left a comment
There was a problem hiding this comment.
Review summary
Multi-agent review (Correctness, Security, Test Coverage, Maintainer; Performance/Build skipped — CI workflow with no perf surface). 21 prior inline threads (10 stale, 11 resolved) all checked — the supply-chain hardening from earlier rounds (refs/heads/main enforcement, dry-run gating, version drift checks, force_skip_tests at preview/stable, Trusted Publishing OIDC) is in place and effective. Most of the structural risk has been addressed.
Verdict: Request changes for 1 Critical finding (inline) plus a few non-blocking suggestions. The Critical is in error-classification logic that this workflow's fail-closed posture depends on.
Critical (1, inline)
get-release-version.js:277—'not found'substring is too broad and silently swallows DNS/HTTP/auth/binary-missing failures fromgh release view, regressing the fail-closed contract: any error containing the lowercase phrase "not found" (e.g.gh: command not found,repository not found,host not found, transientNot Foundfrom the GH API for unrelated reasons) → returnsfalse(= no conflict) → workflow proceeds to publish.
Suggestion (4, inline)
release-sdk-python.yml:11— ref input description says "branch or ref (full git sha)" but the validate step rejects everything except literalmain/refs/heads/main. Description misleads operators.release-sdk-python.yml:185—python-version: '3.11'is hardcoded with no comment. PyPI sdist + wheel layering andpyproject.tomlrequires-pythonshould be cross-referenced; otherwise a future Python bump elsewhere drifts silently from the publish toolchain.release-sdk-python.yml:298—gh release createis not state-drift idempotent. If a previous run created the GH release but failed before tag-push (or vice versa), the next run errors out and the operator has to clean up by hand. Suggest pre-checking the tag/release pair and either short-circuiting or--clobber-ing on dry-run-equivalent state.get-release-version-python-sdk.test.js:197— auto-bump iteration loop ingetNextPatchBaseVersion()and the multi-step preview→stable graduation path don't have a regression test. Single-step paths are covered.
Cross-file (body — files not in this PR's diff)
- TS sibling has the same
'not found'bug atpackages/sdk-typescript/scripts/get-release-version.js:181andscripts/get-release-version.js:168. This Python PR copies the existing pattern from those siblings — same fix should be applied across all three to actually deliver the fail-closed posture mentioned in earlier review rounds. - No
packages/sdk-python/RELEASE.md— the TS SDK has one documenting cadence/preview→stable graduation/rollback. Without the same doc here, on-call won't know the dry-run flow, who can press the button, or how to abort partway. Suggest adding before this lands.
Notes on existing comments (verified by qwen review presubmit)
- 11 prior threads at HEAD
a75f488are resolved (already replied) — not re-raised. - 10 prior threads on earlier commits are stale — superseded by HEAD diff, not re-raised.
- 0 overlap with the inline findings below.
via Qwen Code /review
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
wenshao
left a comment
There was a problem hiding this comment.
[Suggestion] getNextPatchBaseVersion() (line 193) implicitly depends on PyPI versions being authoritative over pyproject.toml. The function mixes getCurrentPackageBaseVersion() (reads pyproject.toml) with PyPI-fetched version data, where PyPI always wins. A refactor that removes or mocks the PyPI lookup would silently regress to incrementing from pyproject.toml, potentially creating version collisions with already-published packages. Consider adding a doc comment: "PyPI stable versions are authoritative; the function returns a base guaranteed higher than any published stable on PyPI. Do not call with an empty or stale versions array."
— glm-5.1 via Qwen Code /review
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
There was a problem hiding this comment.
Pull request overview
Adds an automated release pipeline for the Python SDK (qwen-code-sdk) so the repo’s documented pip install qwen-code-sdk has a real build/validate/publish path, including deterministic version computation for stable/preview/nightly channels.
Changes:
- Introduces a dedicated GitHub Actions workflow to build, test, and publish the Python SDK to PyPI via trusted publishing.
- Adds a Python SDK release-version helper script (PEP 440 mapping + conflict checks) and a comprehensive Vitest suite for it.
- Aligns existing JS/TS release-version helpers’ GitHub release “not found” detection and wires Python CI to react to the new workflow file.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
scripts/tests/get-release-version-python-sdk.test.js |
Adds Vitest coverage for Python SDK release version computation + conflict/resume scenarios. |
scripts/get-release-version.js |
Improves GitHub release “missing” detection logic when checking version conflicts. |
packages/sdk-typescript/scripts/get-release-version.js |
Same GitHub release “missing” detection improvement for the TS SDK script. |
packages/sdk-python/scripts/get-release-version.js |
New release-version resolver for Python SDK (stable/preview/nightly + PyPI/GitHub/git conflict checks). |
package.json |
Adds build:sdk:python convenience script. |
.github/workflows/sdk-python.yml |
Updates path filters to include the new release workflow. |
.github/workflows/release-sdk-python.yml |
New workflow to build/validate/publish qwen-code-sdk to PyPI and create GitHub releases/branches. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Fix failure-issue gate to read github.event.inputs.dry_run directly instead of steps.vars.outputs.is_dry_run (which is empty when early steps fail). Add --repo flag for gh issue create when checkout failed. - Add diagnostic state table to failure-issue body (RELEASE_TAG, PACKAGE_VERSION, PUBLISH_CHANNEL, RESUME_EXISTING_RELEASE, etc.) - Fix release-notes error swallow: only silence release not found / Not Found / HTTP 404, emit ::warning:: for other gh release view errors. - Improve validateVersion error messages to use human-readable format keys (X.Y.Z, X.Y.Z-preview.N) matching TS sibling convention. - Filter fully-yanked versions in getAllVersionsFromPyPI. - Add console.error log when stable is derived from nightly. - Add bash regex guard for inputs.version to prevent shell injection. - Use per-release-type concurrency groups (nightly/preview/stable). - Add jq null-guard checks for all 6 field extractions. - Remove misleading --follow-tags from git push (lightweight tags). 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
The test asserts that preview/nightly releases return empty previousReleaseTag, but the name said "same-channel previous release tags" which implied non-empty values. 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
- Remove -z check in extract_field() that blocked preview/nightly releases (previousReleaseTag is legitimately empty for non-stable releases) - Use static environment.url since step outputs aren't available at job startup - Use skip-existing for resumed PyPI publish to fill in missing artifacts - Add AbortSignal.timeout(30s) to PyPI fetch to prevent indefinite hangs - Add downgrade guard for stable_version_override - Use GHA ::warning:: annotation instead of console.error for visibility - Separate yanked/non-yanked version lists so conflict detection includes yanked versions (PyPI still reserves those slots) - Filter current release from previousReleaseTag to avoid self-reference on resume - Add tests for yanked conflict detection, downgrade guard, and resume previousReleaseTag Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Fix getNextBaseVersion() first-release skip: use pyproject.toml version directly when PyPI has no stable versions instead of unconditionally incrementing - Fix getNextBaseVersion() off-by-one: change > to >= so equal prerelease base continues the existing line instead of incrementing patch - Add ::warning:: annotation when preview auto-bumps due to orphan git tags (tag exists without PyPI version or GitHub release) - Add set -euo pipefail to 5 workflow steps missing it: release_branch, persist_source, Create GitHub release, Delete prerelease branch, Create issue on failure - Fix 2 existing tests affected by first-release change, add 4 new tests 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 7 out of 8 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…upting JSON stdout console.log writes to stdout, which gets captured by VERSION_JSON=$(node ...) in the workflow and corrupts the JSON output for jq. Switch to console.error so ::warning:: annotations go to stderr (GHA recognizes workflow commands on both streams). Also add set -euo pipefail to the "Get the version" step for consistency with other workflow steps. 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
| } | ||
|
|
||
| async function getVersion(options = {}) { | ||
| const args = { ...getArgs(), ...options }; |
There was a problem hiding this comment.
[Suggestion] getVersion() 内部调用 getArgs() 解析 process.argv,在 vitest 测试环境中可能意外捕获测试运行器的命令行参数。当前通过 { ...getArgs(), ...options } 的展开顺序(options 覆盖在前)缓解了此问题,但这属于隐性依赖,增加了测试脆弱性。
建议将 getArgs() 调用移到 CLI 入口点,让 getVersion() 只接受显式传入的参数:
| const args = { ...getArgs(), ...options }; | |
| const args = { ...options }; |
同时在 CLI 入口点保持 getVersion(getArgs()) 不变。
— deepseek-v4-pro via Qwen Code /review
| - name: 'Commit and push package version' | ||
| if: |- | ||
| ${{ steps.vars.outputs.is_dry_run == 'false' }} | ||
| id: 'persist_source' |
There was a problem hiding this comment.
[Suggestion] persist_source 步骤有 4 条分支路径(REMOTE_BRANCH_EXISTS × git diff --staged --quiet),每条路径设置不同的 HAS_PERSISTED_SOURCE 和 RELEASE_TARGET_SHA 值。当前逻辑正确但分支推理不直观,建议在关键条件分支处添加注释说明各路径的意图,方便后续维护者理解每种场景下的预期行为。
— deepseek-v4-pro via Qwen Code /review
* feat(sdk-python): add pypi release workflow Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): build cli before smoke test Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): tighten release conflict handling Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): harden python release workflow Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): tighten stable release guards Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): harden prerelease publish flow Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): reuse release branches on rerun Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): resume incomplete releases Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(release): tighten missing-release checks Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): resume stable release reruns Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): tighten release recovery guards Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(sdk-python): cover release version edge cases Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): address release workflow review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * refactor(sdk-python): address review feedback on release version script - Remove unreachable `if (type === 'stable')` branch in bumpVersion(); the stable path was dead code since getVersion() throws for all stable conflicts before calling bumpVersion(). Move nightly conflict throw to the call site for symmetry. - Rename getNextPatchBaseVersion → getNextBaseVersion to reflect that the function can return a prerelease base without incrementing patch. - Add test for preview+nightly coexistence where nightly base is higher. 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) * fix(sdk-python): address remaining review feedback on release workflow - Fix failure-issue gate to read github.event.inputs.dry_run directly instead of steps.vars.outputs.is_dry_run (which is empty when early steps fail). Add --repo flag for gh issue create when checkout failed. - Add diagnostic state table to failure-issue body (RELEASE_TAG, PACKAGE_VERSION, PUBLISH_CHANNEL, RESUME_EXISTING_RELEASE, etc.) - Fix release-notes error swallow: only silence release not found / Not Found / HTTP 404, emit ::warning:: for other gh release view errors. - Improve validateVersion error messages to use human-readable format keys (X.Y.Z, X.Y.Z-preview.N) matching TS sibling convention. - Filter fully-yanked versions in getAllVersionsFromPyPI. - Add console.error log when stable is derived from nightly. - Add bash regex guard for inputs.version to prevent shell injection. - Use per-release-type concurrency groups (nightly/preview/stable). - Add jq null-guard checks for all 6 field extractions. - Remove misleading --follow-tags from git push (lightweight tags). 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) * fix(sdk-python): rename misleading test description The test asserts that preview/nightly releases return empty previousReleaseTag, but the name said "same-channel previous release tags" which implied non-empty values. 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) * fix(sdk-python): address unresolved review comments on release workflow - Remove -z check in extract_field() that blocked preview/nightly releases (previousReleaseTag is legitimately empty for non-stable releases) - Use static environment.url since step outputs aren't available at job startup - Use skip-existing for resumed PyPI publish to fill in missing artifacts - Add AbortSignal.timeout(30s) to PyPI fetch to prevent indefinite hangs - Add downgrade guard for stable_version_override - Use GHA ::warning:: annotation instead of console.error for visibility - Separate yanked/non-yanked version lists so conflict detection includes yanked versions (PyPI still reserves those slots) - Filter current release from previousReleaseTag to avoid self-reference on resume - Add tests for yanked conflict detection, downgrade guard, and resume previousReleaseTag Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): address final review round on release version script - Fix getNextBaseVersion() first-release skip: use pyproject.toml version directly when PyPI has no stable versions instead of unconditionally incrementing - Fix getNextBaseVersion() off-by-one: change > to >= so equal prerelease base continues the existing line instead of incrementing patch - Add ::warning:: annotation when preview auto-bumps due to orphan git tags (tag exists without PyPI version or GitHub release) - Add set -euo pipefail to 5 workflow steps missing it: release_branch, persist_source, Create GitHub release, Delete prerelease branch, Create issue on failure - Fix 2 existing tests affected by first-release change, add 4 new tests 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) * fix(sdk-python): use stderr for GHA warning annotations to avoid corrupting JSON stdout console.log writes to stdout, which gets captured by VERSION_JSON=$(node ...) in the workflow and corrupts the JSON output for jq. Switch to console.error so ::warning:: annotations go to stderr (GHA recognizes workflow commands on both streams). Also add set -euo pipefail to the "Get the version" step for consistency with other workflow steps. 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) --------- Co-authored-by: jinye.djy <jinye.djy@alibaba-inc.com> Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
* feat(sdk-python): add pypi release workflow Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): build cli before smoke test Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): tighten release conflict handling Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): harden python release workflow Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): tighten stable release guards Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): harden prerelease publish flow Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): reuse release branches on rerun Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): resume incomplete releases Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(release): tighten missing-release checks Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): resume stable release reruns Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): tighten release recovery guards Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(sdk-python): cover release version edge cases Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): address release workflow review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * refactor(sdk-python): address review feedback on release version script - Remove unreachable `if (type === 'stable')` branch in bumpVersion(); the stable path was dead code since getVersion() throws for all stable conflicts before calling bumpVersion(). Move nightly conflict throw to the call site for symmetry. - Rename getNextPatchBaseVersion → getNextBaseVersion to reflect that the function can return a prerelease base without incrementing patch. - Add test for preview+nightly coexistence where nightly base is higher. 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) * fix(sdk-python): address remaining review feedback on release workflow - Fix failure-issue gate to read github.event.inputs.dry_run directly instead of steps.vars.outputs.is_dry_run (which is empty when early steps fail). Add --repo flag for gh issue create when checkout failed. - Add diagnostic state table to failure-issue body (RELEASE_TAG, PACKAGE_VERSION, PUBLISH_CHANNEL, RESUME_EXISTING_RELEASE, etc.) - Fix release-notes error swallow: only silence release not found / Not Found / HTTP 404, emit ::warning:: for other gh release view errors. - Improve validateVersion error messages to use human-readable format keys (X.Y.Z, X.Y.Z-preview.N) matching TS sibling convention. - Filter fully-yanked versions in getAllVersionsFromPyPI. - Add console.error log when stable is derived from nightly. - Add bash regex guard for inputs.version to prevent shell injection. - Use per-release-type concurrency groups (nightly/preview/stable). - Add jq null-guard checks for all 6 field extractions. - Remove misleading --follow-tags from git push (lightweight tags). 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) * fix(sdk-python): rename misleading test description The test asserts that preview/nightly releases return empty previousReleaseTag, but the name said "same-channel previous release tags" which implied non-empty values. 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) * fix(sdk-python): address unresolved review comments on release workflow - Remove -z check in extract_field() that blocked preview/nightly releases (previousReleaseTag is legitimately empty for non-stable releases) - Use static environment.url since step outputs aren't available at job startup - Use skip-existing for resumed PyPI publish to fill in missing artifacts - Add AbortSignal.timeout(30s) to PyPI fetch to prevent indefinite hangs - Add downgrade guard for stable_version_override - Use GHA ::warning:: annotation instead of console.error for visibility - Separate yanked/non-yanked version lists so conflict detection includes yanked versions (PyPI still reserves those slots) - Filter current release from previousReleaseTag to avoid self-reference on resume - Add tests for yanked conflict detection, downgrade guard, and resume previousReleaseTag Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk-python): address final review round on release version script - Fix getNextBaseVersion() first-release skip: use pyproject.toml version directly when PyPI has no stable versions instead of unconditionally incrementing - Fix getNextBaseVersion() off-by-one: change > to >= so equal prerelease base continues the existing line instead of incrementing patch - Add ::warning:: annotation when preview auto-bumps due to orphan git tags (tag exists without PyPI version or GitHub release) - Add set -euo pipefail to 5 workflow steps missing it: release_branch, persist_source, Create GitHub release, Delete prerelease branch, Create issue on failure - Fix 2 existing tests affected by first-release change, add 4 new tests 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) * fix(sdk-python): use stderr for GHA warning annotations to avoid corrupting JSON stdout console.log writes to stdout, which gets captured by VERSION_JSON=$(node ...) in the workflow and corrupts the JSON output for jq. Switch to console.error so ::warning:: annotations go to stderr (GHA recognizes workflow commands on both streams). Also add set -euo pipefail to the "Get the version" step for consistency with other workflow steps. 🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code) --------- Co-authored-by: jinye.djy <jinye.djy@alibaba-inc.com> Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Summary
Release Python SDKGitHub Actions workflow to build, validate, and publishqwen-code-sdkto PyPI.packages/sdk-python/scripts/get-release-version.jsto compute stable, preview, and nightly Python SDK release versions with PyPI/GitHub conflict checks.npm run build:sdk:pythonand wired the normal SDK Python CI workflow to react to the new release workflow file.pip install qwen-code-sdk, but there was no PyPI release path for the Python SDK.Validation
node packages/sdk-python/scripts/get-release-version.js --type=nightly node packages/sdk-python/scripts/get-release-version.js --type=preview node packages/sdk-python/scripts/get-release-version.js --type=stable --stable_version_override=v0.1.0 python3.11 -m pip install -e 'packages/sdk-python[dev]' build python3.11 -m ruff check --config packages/sdk-python/pyproject.toml packages/sdk-python python3.11 -m ruff format --check --config packages/sdk-python/pyproject.toml packages/sdk-python python3.11 -m mypy --config-file packages/sdk-python/pyproject.toml packages/sdk-python/src python3.11 -m pytest -c packages/sdk-python/pyproject.toml packages/sdk-python/tests -q python3.11 packages/sdk-python/scripts/smoke_real.py --qwen qwen --cwd /Users/jinye.djy/.codex/worktrees/60ac/qwen-code --json-only python3.11 -m build packages/sdk-python npm run build npm run typecheck npm run bundle--type=nightly,--type=preview,--type=stable --stable_version_override=v0.1.0packages/sdk-python/scripts/smoke_real.pyand verifies async single-turn, async control flow, and sync query execution.pytest:58 passed in 1.08s"ok": truepackages/sdk-python/dist/qwen_code_sdk-0.1.0.tar.gzandpackages/sdk-python/dist/qwen_code_sdk-0.1.0-py3-none-any.whlnpm run build,npm run typecheck, andnpm run bundlecompleted.npm run buildemitted pre-existing ESLint warnings inpackages/vscode-ide-companion, but no errors..github/workflows/release-sdk-python.ymlandpackages/sdk-python/scripts/get-release-version.js.node packages/sdk-python/scripts/get-release-version.js --type=preview.python3.11 -m pytest -c packages/sdk-python/pyproject.toml packages/sdk-python/tests -q.{ "releaseTag": "v0.1.1-nightly.20260428023154.f0e860198", "releaseVersion": "0.1.1-nightly.20260428023154.f0e860198", "packageVersion": "0.1.1.dev20260428023154", "previousReleaseTag": "", "publishChannel": "nightly" }{ "releaseTag": "v0.1.1-preview.0", "releaseVersion": "0.1.1-preview.0", "packageVersion": "0.1.1rc0", "previousReleaseTag": "", "publishChannel": "preview" }{ "releaseTag": "v0.1.0", "releaseVersion": "0.1.0", "packageVersion": "0.1.0", "previousReleaseTag": "", "publishChannel": "latest" }Scope / Risk
qwen-code-sdkbefore the workflow can publish.QwenLMqwen-coderelease-sdk-python.ymlproduction-releaseTesting Matrix
Testing matrix notes:
ubuntu-latest, but I did not execute it in GitHub Actions in this change.Linked Issues / Bugs