⚠️ Important Changes
- Dependency management migrated to uv (#2509):
requirements.txt,requirements-dev.txt, and the legacysetup.pyare gone — dependencies now live inpyproject.tomlwith a committeduv.lock. Set up a dev environment withuv syncand run tools viauv run. Optional features are now extras (lambda,langchain—uv sync --extra <name>) or a dependency group (similar-issue—uv sync --group similar-issue), and Docker images install from the lockfile withuv sync --frozen. Installing from PyPI withpip install pr-agentstill works. - Linting consolidated on Ruff (#2880): flake8 and the standalone isort pre-commit hook were removed. Contributors should run
uv run ruff check --fixon touched files before committing. - Dependency pins relaxed to patched ranges (#2881): exact pins were loosened so downstream consumers can pick up security updates; LiteLLM was also upgraded to v1.98.0 (#2794).
🚀 Features
- feat(ask): make the ask heading configurable by @oleksii-tumanov in #2823
- feat: add opt-in estimated API cost reporting by @elijahchancey in #2817
- feat(improve): make suggestions heading configurable by @oleksii-tumanov in #2820
- feat(gitlab): resolve the agent's own outdated inline threads by @Arta-shoja in #2774
- feat(gitlab): batch-publish committable code suggestions as one review by @nlinakis-xm in #2635
- feat(review): make the review heading configurable by @oleksii-tumanov in #2797
- feat(ask): resolve review threads via /ask_line by @rophy in #2796
- feat(models): add Bedrock Grok 4.3 support by @swayamg20 in #2588
- feat(cli): add structured JSON output for local reviews by @Kyzcreig in #2532
- enable bedrock access through private VPC endpoint by @luisrviz in #2663
🐛 Bug Fixes
- fix(polling): enforce process limit before spawning by @PeterDaveHello in #2872
- fix(improve): clean up progress comment on cancellation by @junnhwan in #2850
- Fix: log dropped inline comments by @raappo in #2876
- fix(mosaico): preserve request errors around Langfuse spans by @junnhwan in #2865
- fix: skip non-UTF-8 files in Local Git and Gerrit diffs by @oleksii-tumanov in #2858
- fix(codecommit): skip non-UTF-8 files in diffs by @oleksii-tumanov in #2860
- fix: YAML parser error from diff-style lines in nested lists by @isExample in #2061
- fix: demote openrouter reasoning_effort warning to info for non-none values by @Newer1107 in #2866
- fix(skills): respect per-command settings in request-scoped cache by @junnhwan in #2857
- fix(ask-line): enforce conversation history token budget by @junnhwan in #2862
- fix: show partial code suggestion coverage by @YaoSong808 in #2863
- fix(suggestions): retain successful chunks after partial failure by @junnhwan in #2829
- fix(openrouter): normalize reasoning controls by @PeterDaveHello in #2837
- fix: accept case-insensitive YAML fence labels by @alexsmolya in #2842
- fix(gerrit): align diff metadata and filtering by @lxingy3 in #2836
- fix: preserve target indentation in improve suggestions by @Oxygen56 in #2429
- fix(describe): clean up progress comments on failure and cancellation by @junnhwan in #2833
- fix(github): release cancelled push-trigger waiters by @junnhwan in #2827
- fix(agent): preserve asyncio cancellation at request boundary by @junnhwan in #2832
- fix(suggestions): only offer applicable changes by @TLA020 in #2649
- fix(ask_line): skip the model call when no hunk lines are selected by @Evhye38496 in #2807
- fix: propagate exception from verified inline comment publishing by @karesansui-u in #2258
- fix(github): handle null GraphQL fields in fetch_sub_issues by @erkdgn in #2785
- fix(agent): preserve quoted webhook command arguments by @junnhwan in #2813
- fix: fall back for oversized Claude token requests by @junnhwan in #2811
- fix: recognize generated descriptions with leading content by @bunnysayzz in #2667
- fix: accept whitespace between code fence and yaml info string by @bunnysayzz in #2622
- fix(gitlab): support numeric project ID merge request URLs by @waewoo in #2719
- fix(gitlab): restore ticket context in reviews by @Fnine59 in #2802
- fix(gitlab): strip sub-path prefix when parsing merge request URLs by @Evhye38496 in #2806
- fix(pr_agent/algo/file_filter.py): warning when an ignore pattern cannot compile by @dwin-gharibi in #2748
- fix(pr_agent/algo/pr_processing.py): coercing patch_extra_lines settings to int by @dwin-gharibi in #2740
- fix(pr_agent/algo/pr_processing.py): filling token counts before sorting the compressed diff by @dwin-gharibi in #2734
- fix(pr_agent/servers/bitbucket_app.py): building the secret provider per process by @dwin-gharibi in #2736
- fix(review): publish failure result for manual runs by @oleksii-tumanov in #2795
- fix(pr_agent/algo/utils.py): clamping the review effort score to its scale by @dwin-gharibi in #2760
- fix(pr_agent/algo/git_patch_processing.py): skipping lines that are not unified hunk headers by @dwin-gharibi in #2755
- fix(azure): handle commits without changes by @junnhwan in #2786
- fix(bitbucket-server): preserve MOVE rename semantics in pull request diffs by @junnhwan in #2801
- fix(repo-context): propagate provider fetch errors by @junnhwan in #2793
- fix(pr_agent/algo/skills_loader.py): keeping truncated skills inside the token budget by @dwin-gharibi in #2770
- fix(pr_agent/tools/pr_add_docs.py): range-checking the model's line numbers by @dwin-gharibi in #2758
- fix: /ask on outdated review comments crashes with TypeError by @rophy in #2784
- fix(codecommit): include deleted files in review diffs by @Fnine59 in #2789
- fix: add config.max_output_tokens so completion calls carry an output token limit by @IsmaelMartinez in #2632
- fix(ask): stop discarding GitLab answers that mention quick actions (#2302) by @IsmaelMartinez in #2628
- fix(pr_agent/algo/token_handler.py): coercing the token estimate factor to float by @dwin-gharibi in #2742
- fix(pr_agent/algo/ai_handlers/langchain_ai_handler.py): moving the Runnable import inside the guard by @dwin-gharibi in #2732
- fix(bitbucket): propagate repo context fetch errors by @junnhwan in #2791
- fix(gitea): strip the full /api/v1/repos prefix when parsing URLs by @jamesbraid in #2780
- fix: sanitize illegal control characters before YAML parsing by @kate1128 in #2618
- fix(pr_agent/algo/utils.py): rendering nested config values as yaml by @dwin-gharibi in #2752
- fix(pr_agent/algo/utils.py): guarding the empty relevant line lookup by @dwin-gharibi in #2772
- fix(pr_agent/algo/utils.py): rendering the review without mutating the caller's data by @dwin-gharibi in #2764
- fix(pr_agent/algo/utils.py): accepting a single ticket compliance entry by @dwin-gharibi in #2762
- fix(pr_agent/algo/utils.py): skipping a malformed contribution time estimate by @dwin-gharibi in #2746
- fix(pr_agent/algo/utils.py): reporting an unreadable token budget instead of ignoring it by @dwin-gharibi in #2744
- fix(pr_agent/algo/utils.py): coercing configured token limits to int by @dwin-gharibi in #2738
- fix(pr_agent/git_providers/github_provider.py): normalising inverted line ranges in links by @dwin-gharibi in #2766
- fix(pr_agent/git_providers/github_provider.py): keying global settings on the host by @dwin-gharibi in #2750
- fix(github-provider): preserve old_filename and content on renames by @AmirF194 in #2776
- Fix Azure diff fallback logging by @LunaMeerkats in #2869
- fix(repo-context): separate cache entries by source branch by @junnhwan in #2856
- fix(gitlab): retry overflowed merge request diffs by @junnhwan in #2810
- Fix/litellm custom provider override by @Taooo-habitus in #2344
- Update event handling for pull request updates by @michaelwellsjr in #2637
- fix(pr_agent/tools/pr_code_suggestions.py): coercing the per-chunk suggestion count by @dwin-gharibi in #2754
- Fix deferred LiteLLM callback draining by @PeterDaveHello in #2614
- fix(review): remove stale progress comments by @oleksii-tumanov in #2788
- fix(labels): escape single quotes in custom label descriptions by @gvago in #2320
- fix: avoid UnboundLocalError in _calc_claude_tokens error handler by @karesansui-u in #2256
📚 Documentation
- docs: consolidate agent instructions in AGENTS.md by @PeterDaveHello in #2822
- docs(usage-guide): document OrcaRouter as an OpenAI-compatible gateway by @nissrin2020ali-ux in #2834
- docs: restore pip install pr-agent now that PyPI publishing has resumed by @naorpeled in #2777
🧹 Maintenance
- chore(deps): relax exact pins to patched ranges for consumer security updates by @naorpeled in #2881
- chore: consolidate linting on ruff, replace flake8 by @naorpeled in #2880
- chore: migrate dependency management to uv by @shmulc8 in #2509
- chore(deps): Upgrade security dependencies by @PeterDaveHello in #2808
- chore(deps): bump Python base image from 3.12.13 to 3.12.14 by @PeterDaveHello in #2809
- chore(deps): Upgrade LiteLLM to the latest stable v1.98.0 by @PeterDaveHello in #2794
- chore: bump version from 0.41.0 to 0.43.0 by @naorpeled in #2778
Full Changelog: v0.43.0...v0.44.0