v0.50.02026-11-07
⚠️ Breaking changes and upgrade notes
- Host-only settings: Repository .pragent.toml files can no longer override GitHub pacing and retry settings (github.secondsbetweenrequests, github.secondsbetweenwrites, github.apiretries, github.ratelimitretries), config.numretries, azuredevopsserver.agentidentity, custom-label settings (config.enablecustomlabels and [customlabels]), or prcodesuggestions.maxnumberofcalls. config.numretries is capped at 10. Per-directory .pragent.toml files also cannot set prcodesuggestions.dualpublishingscorethreshold. Move values you rely on to host configuration. (#4445, #4475, #4485, #4632, #4745)
- Comment arguments: config.aitimeout and prcodesuggestions.maxnumberofcalls can no longer be set through command comments. (#4445)
- Removed no-op settings: prcodesuggestions.approvepronselfreview and prcodesuggestions.foldsuggestionsonselfreview are removed from the shipped configuration. PR-Agent warns if they remain set; they never changed /improve behavior. (#4598)
- Custom provider integrations: Unused provider methods and capability names were removed. Review #4691 if a custom provider calls those internal methods.
- Auto-approval: config.enableautoapproval is now host-only. The auto-approval path remains disabled in this release. (#4700)
🔐 Trusted Publishing
PyPI releases now use PyPI Trusted Publishing through GitHub Actions OIDC and produce package attestations. The release workflow rejects commits that are not reachable from main. (#3909)
🚀 Features
- feat(push\_outputs): select tools and deliver Ask answers by @PeterDaveHello in #4739
- feat(cli): enable JSON output for plain-diff describe and improve by @PeterDaveHello in #4730
- feat(i18n): localize improve summaries and empty states by @PeterDaveHello in #4731
- feat(config): add protected host system instructions by @Evhye38496 in #4716
- feat(i18n): translate the fixed text of the /review comment into response\_language by @AdelFetner in #4684
- feat: add Microsoft Teams output sink by @utsab345 in #4630
- feat(repo-context): expand @path imports by @utsab345 in #4620
- feat(review): include commit messages in /review and /improve prompts by @abhiramshaji-cyber in #4603
- feat(scripts): link config reference sections to their docs pages by @mirzasnowy in #4596
- feat(doctor): check configured output destinations by @oleksii-tumanov in #4541
- feat(config): identify keys absent from shipped declarations by @oleksii-tumanov in #4505
- feat(litellm): add per-PR session ids by @utsab345 in #4503
- feat(models): support Kimi K3 / K3.1 Pro and bypass temperature parameter by @JI4JUN in #4515
- feat(review): add an opt-in deterministic structural-reach row by @moinerus in #4421
- feat: support Amazon Bedrock guardrails on the Converse route by @luisrviz in #4420
- feat: configure improve failure comments by @utsab345 in #4426
- feat(models): add Claude Sonnet 5.5 and Haiku 5.5 support by @montss in #4360
- feat(model-routing): support a patch character limit by @oleksii-tumanov in #4376
- feat(github-action): stop the runner on a failed key check by @Yoel-qin in #4325
🐛 Bug Fixes
- [Bug] Prefetch review diff outside the event loop by @askarshabdanov1-collab in #4403
- fix(ci): Restrict releases to main and attest PyPI packages by @oleksii-tumanov in #3909
- fix(config): keep dual\publishing\score\_threshold out of per-directory settings by @shu-chen-dot-ca in #4745
- fix(gitea): build file links for AGit-flow PRs from the head SHA by @Yi-111-a in #4744
- fix(plain-diff): strip terminal controls from Markdown output by @jiangjiang248 in #4738
- fix(github): keep suggestions just outside a hunk instead of dropping them by @ylcn91 in #4734
- fix(servers): parse string-valued boolean settings in webhook servers by @ylcn91 in #4735
- fix: pin auto-approval to the reviewed head and make enable\auto\approval host-only by @wanjinhao1 in #4700
- fix(improve): reuse persistent summaries when history is disabled by @PeterDaveHello in #4717
- fix(servers): honor disabled string-valued push triggers by @PeterDaveHello in #4720
- fix(output): preserve stdout JSON on restricted encodings by @PeterDaveHello in #4719
- fix(doctor): keep the report when stdout cannot encode it by @Bortlesboat in #4714
- fix(security): reject host-only and forbidden keys written with whitespace around the section dot by @Yi-111-a in #4686
- fix(push\_outputs): require exact channel names by @PeterDaveHello in #4705
- fix(gitlab): ignore unified-diff file headers in per-file line counts by @zhengqiuyang in #4651
- fix: neutralize GitLab mentions by @utsab345 in #4631
- fix(github): support GitHub Enterprise Cloud data residency (\*.ghe.com) by @alexjansons in #4688
- fix(providers): build help\_docs links from the whole repo URL by @Xch4rt in #4687
- fix(review): preserve distinct ticket identities across chunks by @rudycelekli in #4662
- fix(improve): preserve literal data in already aligned replacements by @rudycelekli in #4674
- fix(diff): keep negative context settings from corrupting hunk counts by @rudycelekli in #4680
- fix(usage): reject negative and boolean token counts by @rudycelekli in #4664
- fix(describe): retain files when unused optional summaries are malformed by @rudycelekli in #4676
- fix(improve): retain suggestions with quoted or unusable length caps by @rudycelekli in #4681
- fix(add\_docs): validate model anchors and placement before insertion by @rudycelekli in #4677
- fix(doctor): align endpoint and key checks with model routing by @PeterDaveHello in #4570
- fix(bitbucket): preserve significant spaces in rename paths by @rudycelekli in #4682
- fix(action): write Unicode outputs using UTF-8 by @rudycelekli in #4663
- fix(diff): preserve Git line boundaries in supplied diff parsing by @rudycelekli in #4668
- fix(azure): preserve physical lines in suggestion ranges and reconciliation by @rudycelekli in #4672
- fix(azure): keep the suggestion fence in inline /improve threads by @Chebaleomkar in #4659
- fix(review): keep invalid chunk scores out of conservative reduction by @rudycelekli in #4669
- fix(routing): skip overflowing model limits by @rudycelekli in #4667
- fix: keep an unpaired backtick literal in replace\code\tags by @kevin9327 in #4679
- fix(tickets): offload blocking ticket reads by @PeterDaveHello in #4658
- fix(action): skip duplicate first-open review requests by @Aschenbath in #4654
- fix(bitbucket): decode raw file contents as UTF-8 by @tanishqbaweja in #4648
- fix(describe): strip whitespace from type items before schema validation by @mirzasnowy in #4647
- fix: scope response language instructions to each command by @PeterDaveHello in #4645
- fix(jira): accept Jira Cloud project keys that contain digits by @tanishqbaweja in #4646
- fix: retry truncated responses before publishing tool results by @PeterDaveHello in #4640
- fix(diff): preserve complete filenames in compressed metadata by @PeterDaveHello in #4639
- fix(azure): preserve encoded PR names in published links by @Aschenbath in #4637
- fix(labels): remove labels left out of the set on Gitea by @tanishqbaweja in #4628
- fix: protect custom labels from repo overrides by @utsab345 in #4632
- fix(gerrit): keep credentials out of child arguments by @utsab345 in #4569
- fix(labels): remove labels left out of the set on Azure DevOps by @tanishqbaweja in #4618
- fix: deprecate no-op self-review marker keys by @utsab345 in #4598
- fix(azure): resolve agent identity for persistent reviews by @dellch in #4613
- fix: align config comments and large patch fallback by @utsab345 in #4593
- fix(bitbucket-server): find the projects/users segment by its position in the PR URL by @tanishqbaweja in #4563
- fix(github-action): allow static commands without model keys by @PeterDaveHello in #4583
- fix(structura
v0.49.02026-10-25
⚠️ Upgrade notes
- GitHub polling needs an allowlist. New host-only github.polling_repositories = ["owner/repo", ...]; empty (the default) ignores every notification, so polling deployments must set it (#4294).
- Jira projectkeys = [] now disables lookups. The default is now [""]. If you set [] to mean "all projects", change it to ["*"] or remove it (#4049).
- litellm.extraheaders is host-only. Repository .pragent.toml and comment arguments can no longer set it (#4287).
- Default model is now gpt-6.1-sol with gpt-6-luna as fallback (was gpt-5.6 / gpt-5.6-terra). Pin config.model to keep the old one (#4088).
- Langfuse SDK 4.18.0 needs self-hosted Langfuse 3.63.0+; use the langfuse_otel callback (#4343).
- GitHub App token in Actions: set github.agent_login to <app-slug>[bot] so PR-Agent recognises its own comments (#4329).
✨ Highlights
- pr-agent doctor preflights a deployment (#4321).
- --json-output for /describe, /improve and /review (#4265, #4227, #4226).
- Jira scoped API tokens (#4250), /ask with the CI artifact as context (#4176), globs in repocontextfiles (#4220), opt-in GitLab subgroup settings inheritance (#4059).
- Security hardening: DNS rebinding block, repo-context path escapes, host-only config output, loguru diagnose off, more credential redaction (#4252, #4279, #4293, #4280, #4328).
What's Changed
- Redact Stripe, Twilio and SendGrid credentials by @IlyaKhalafi in #4328
- ci(review): make self-hosted /improve post suggestions again by @Yoel-qin in #4174
- Enable automatic /review on new PRs (fixes #4162) by @kiranmutyala18 in #4170
🚀 Features
- feat(artifacts): support multiple artifact files by @utsab345 in #4338
- feat(cli): add a doctor command to preflight the deployment by @Yoel-qin in #4321
- feat(describe): write the description to --json-output by @Yoel-qin in #4265
- feat(jira): support scoped API tokens by @utsab345 in #4250
- feat(repo-context): glob entries and fallback alternatives in repo\context\files by @ira-at-work in #4220
- feat(ask): include organizational skills in line-level answers by @Yoel-qin in #4225
- feat(review): list the files left out in the JSON output by @Sajinthan in #4226
- feat(improve): write suggestions to --json-output by @Sajinthan in #4227
- feat(ask): answer questions with the CI artifact as context by @Yoel-qin in #4176
- feat(help): prioritize a matching document in constrained prompts by @oleksii-tumanov in #4101
- feat(gitlab): add opt-in closest-subgroup settings inheritance by @ashearin in #4059
- feat(improve): retain equal summaries across files by @oleksii-tumanov in #4128
🐛 Bug Fixes
- fix(ask\_line): defer handler setup until a diff hunk matches by @oleksii-tumanov in #4354
- fix(mosaico): retain tasks with bounded owner history by @utsab345 in #4337
- fix(add-docs): retry malformed model responses with fallback models by @PeterDaveHello in #4346
- fix(routing): count diff hunks without splitting patch lines by @PeterDaveHello in #4344
- fix: retry whitespace-only model completions by @PeterDaveHello in #4348
- fix(azure): reject incomplete linked work item responses by @oleksii-tumanov in #4173
- fix(algo): prefer exact source lines before fuzzy matching by @PeterDaveHello in #4340
- fix(similar\_issue): use the supported Qdrant query API by @PeterDaveHello in #4341
- fix(azure): handle created events without a web link by @oleksii-tumanov in #4171
- fix(ask): answer with a note when every changed file is filtered out by @sarankumar1325 in #4336
- fix(gitlab): paginate repository directory listings by @utsab345 in #4332
- fix(github): let the operator name the agent login an app token posts as by @sarankumar1325 in #4329
- fix: reject boolean routing limits by @utsab345 in #4302
- fix: parse GitLab boolean settings by @utsab345 in #4303
- fix: stop Gitea changed-files pagination at the advertised total by @fixfon in #4306
- fix(describe): retain valid YAML file-description chunks by @PeterDaveHello in #4315
- fix(gitlab): preserve Git line boundaries when resolving fixed threads by @PeterDaveHello in #4313
- fix(improve): keep embedded fences inside summary diffs by @PeterDaveHello in #4312
- fix: skip generate\labels, add\docs and update\_changelog when all files are filtered by @swayamg20 in #4307
- fix(help\_docs): preserve fenced examples during cleanup by @PeterDaveHello in #4319
- fix: reject boolean body size limits by @utsab345 in #4301
- fix: normalize list settings consistently by @utsab345 in #4300
- fix: restrict polling to allowlisted repositories by @utsab345 in #4294
- fix: hide host-only configuration output by @utsab345 in #4293
- fix: anchor incremental reviews to agent comments by @utsab345 in #4292
- fix: require bot authorship for describe persistent comments by @utsab345 in #4291
- fix: authorize cross-project GitLab tickets by @utsab345 in #4290
- fix(config): keep litellm.extra\_headers host-only by @fixfon in #4287
- fix: disable loguru diagnose and backtrace by @utsab345 in #4280
- fix: reject escaping repo context paths by @utsab345 in #4279
- fix(github): use the GraphQL endpoint on GitHub Enterprise Server by @MaxFreedomPollard in #4272
- fix(help\_docs): preserve ranked documents that already fit by @PeterDaveHello in #4267
- fix(review): preserve source characters in patch-based snippets by @PeterDaveHello in #4268
- fix(review): resolve findings in a chunked review when none were cut by @jadhavgaurav in #4222
- fix(config): honor settings context selection by @utsab345 in #4251
- fix(ci): update uv security pin by @utsab345 in #4263
- fix(ignore): keep bracket expressions in string glob patterns by @utsab345 in #4245
- fix(skills): treat a string paths value as one path by @utsab345 in #4244
- fix: parse CRLF plain diffs correctly by @strawberry-little-bear in #4231
- fix(ignore): cap glob length by @utsab345 in #4259
- fix: treat scalar PR ignore settings as single values by @kocaemre in #4257
- fix(security): block DNS rebinding by @utsab345 in #4252
- fix: normalize scalar PR commands by @utsab345 in #4253
- fix(bitbucket): read ambiguous diff headers from patch metadata by @utsab345 in #4248
- fix(outputs): deliver the sinks off the event loop by @utsab345 in #4247
- fix(polling): avoid rerunning commands found in comment history by @PeterDaveHello in #4239
- fix(gitlab): publish notice for incomplete merge request diffs by @Evhye38496 in #4234
- fix(help): render static help without initializing an AI handler by @PeterDaveHello in #4241
- fix(labels): preserve label changes made during model calls by @PeterDaveHello in #4237
- fix(bedrock): stop sending temperature to GLM-5 by default by @ira-at-work in #4219
- fix(repo-context): survive a failed revision lookup by @utsab345 in #4246
- fix(algo): keep yaml fence stripping linear by @utsab345 in #4232
- fix: stop bare #N in comments, link text, colours and words becoming tickets by @jay23606 in #4198
- fix: prevent local config contents in log artifact while preserving PR comment by @wjc2821296948 in #4197
- fix(describe): fall back on unusable model responses by @PeterDaveHello in #4186
- fix(gitlab): avoid double-encoding submodule project paths by @PeterDaveHello in #4214
- fix(changelog): retry empty model responses before publishing by @PeterDaveHello in #4209
- fix(help\_docs): recognize Unicode letters in documentation by @PeterDaveHello in #4206
- fix: skip review and describe when all files are filtered by @utsab345 in #4204
- fix(help\_docs): recount tokens after cleaning documentation by @PeterDaveHello in #4188
- fix(review): preserve case-sensitive paths when merging chunks by @PeterDaveHello in #4182
- fix(gerrit): bound direct git and SSH commands by @oleksii-tumanov in #4177
- fix(plain-diff): decode Git-quoted file paths by @Aling33 in #4152
- fix(add\_docs): preserve literal indentation in suggestions by @oleksii-tumanov in #4172
- fix(review): preserve corrected answers fo
v0.48.02026-10-16
⚠️ Breaking Changes
> [!WARNING]
> This release changes several defaults and makes more settings host-only. Check each item below against your deployment before upgrading.
- pip install pr-agent no longer installs the git provider SDKs (#3679): PyGithub, python-gitlab, atlassian-python-api, the Azure DevOps SDKs, boto3, giteapy, the Google Cloud SDKs and a2a-sdk moved to the github, gitlab, bitbucket, azure, codecommit, gitea, google and mosaico extras. Install the ones you use, for example pip install "pr-agent[github]", or pr-agent[all] for the previous set. The Docker images already install all.
- Docker service images run as a non-root user (#3910): the webhook, app, polling and Mosaico targets run as UID/GID 10001 with HOME=/home/pragent. Mounted secrets must be readable by that user, output and database directories must be writable, and home-relative mounts should move to /home/pragent. The GitHub Action, CLI and Lambda images still run as root.
- Azure DevOps and Bitbucket Server webhooks require credentials (#3911): with azuredevopsserver.webhookusername/webhookpassword or bitbucketserver.webhooksecret unset, every webhook is rejected with HTTP 403. Set them on both the sender and PR-Agent before upgrading.
- GitLab webhooks backed by a secret provider need a new token format (#3913): when GitLab credentials come from AWS Secrets Manager or Google Cloud Storage, the webhook's Secret Token must be <secret-name>:<webhook-token>. Name-only tokens are rejected with HTTP 401, so update the webhooks when you deploy.
- Namespace-wide settings are off by default (#3908): PR-Agent no longer applies <namespace>/pr-agent-settings to every repository automatically. Set the host-only config.globalsettingsrepo = "pr-agent-settings" to keep the old behaviour.
- [tool.pr-agent] in pyproject.toml is no longer read (#3941): move those settings to .pr_agent.toml.
- More settings are host-only (#3840, #3904, #3950, #4001, #4054): a repository's .pragent.toml and comment arguments can no longer set provider endpoints (openai.apibase and the other apibase keys), keys ending in url, endpoint, org, key, token or secret, provider auth mode and TLS settings (github.deploymenttype, gitlab.authtype/sslverify, bitbucket.authtype, gitea.skipsslverification/sslcacert), jira.jirasite/jiraapiemail/project_keys, or LiteLLM callbacks. They are ignored with a warning, so set them in host configuration instead. Comment arguments are restricted further as well (#3902).
- Gitea and Gerrit read repository settings from the target branch (#3906): Gitea uses the PR base and Gerrit the default branch, so a .pr_agent.toml change inside a PR no longer applies to that PR.
- Cross-repository reads need an allowlist (#3922, #3897): GitHub ticket context only reads linked issues and sub-issues from the PR's own repository or same-owner repositories listed in config.repocontextsiblingrepos. gitlab.expandsubmodule_diffs only expands submodules listed there that sit in the MR's top-level group.
- Ignore rules now cover comment commands (#3943): config.ignoreprauthors, ignoreprlabels, ignoreprtitle, the branch rules and ignore_repositories now skip manually triggered commands too, not only automatic ones.
- mergerecommendation values were renamed (#4010): with prreviewer.requiremergerecommendation on, safetomerge is now noconcernsfound and mergewithcaution is now needsreview. changesrequired is unchanged. Update anything that parses review output.
- /describe comments no longer repeat the PR description (#4118): with prdescription.publishdescriptionascomment = true, the comment leaves out the User Description section even when addoriginaluser_description is on, because the PR body is left untouched.
- Smaller behaviour changes: webhook servers reject request bodies over 5 MiB with HTTP 413 (config.maxwebhookrequestbodybytes, #3820). A positive config.maxoutputtokens below 4096 is raised to 4096 (#4013). /describe and /generate_labels drop model labels outside the PR types and enabled custom labels (#3899).
What's Changed
🚀 Features
- feat: show agent run details on /ask, /ask\line, /update\changelog, and /help answers by @ashearin in #4091
- feat(linear): add linked issue context for ticket compliance by @lkshrk in #4078
- Add support for Gemini 4 Argon by @takotakot in #4120
- feat: support CompactifAI provider credentials by @favouradesiyan in #3737
- feat(gitea): support inline key issues by @fbidu in #4131
- feat(ci): post PR-Agent output as the PR Agent GitHub App when configured by @naorpeled in #4051
- feat(ci): enable sponsored descriptions and improvements on PR open by @ofir-frd in #4002
- feat(review): honor human-resolved GitHub key issues by @erezlev13 in #4032
- feat: cache the shared skills prefix across review tools by @utsab345 in #4014
- feat: export PR reviews as JSON by @utsab345 in #4033
- feat(review): honor explicit Azure key-issue dismissals by @erezlev13 in #4025
- feat(review): add opt-in failure modes by @oleksii-tumanov in #4012
- feat(artifacts): choose which end of the file truncation keeps by @Yoel-qin in #3990
- feat(tickets): include native issue references from PR titles by @oleksii-tumanov in #3980
- feat(review): treat human-resolved inline key-issue threads as dismissed by @hkn-wt in #3925
- feat(github): stream chunk progress into in-progress check runs by @Yoel-qin in #3933
- feat(models): add OpenAI GPT-6.1 Sol support by @PeterDaveHello in #3938
- feat(describe): report chunk progress in the progress comment by @Yoel-qin in #3872
- feat(push-outputs): add Telegram channel by @noooooooookro in #3868
- feat(local): support repo context files in the local git provider by @YokoAC in #3863
- feat(gitlab): react to how a comment command ended by @PeterDaveHello in #3852
- feat(otel): export per-command token usage by @utsab345 in #3835
- feat(models): add OpenAI GPT-6 Sol and Luna support by @PeterDaveHello in #3628
- feat: report chunk progress in the progress comment by @utsab345 in #3814
- feat(review): give /review the findings of earlier reviews by @hkn-wt in #3750
🐛 Bug Fixes
- fix(describe)!: skip original user description when published as comment by @maurerle in #4118
- fix(gitlab): retry the first merge request lookup on 404 for new MR webhooks by @jadhavgaurav in #3995
- fix(bedrock): stop sending temperature to Kimi K3 and GLM-5 by default by @ira-at-work in #3752
- fix(security): redact bare provider tokens from logs and artifacts by @Yoel-qin in #4081
- fix(mosaico): consume the Eclipse registry deployment image by @ofir-frd in #4148
- fix(litellm): initialize without the optional
v0.47.02026-10-02
⚠️ Important Changes
- Gitea webhooks now require a secret (#3637): with gitea.webhook_secret unset, the Gitea app rejects every webhook with HTTP 403 instead of accepting it unsigned. Set the secret on the Gitea webhook and in your config before upgrading.
- The GitHub Action fails on tool errors (#3712): a tool failure that used to be logged and swallowed now fails the Action. Set githubactionconfig.failontool_errors = false to keep the old green behaviour.
- Comment commands need a leading / on GitLab, Bitbucket and Bitbucket Server (#3769): a comment only runs a tool when it starts with a slash command, so plain comments that mention one no longer trigger anything.
- extraconfigurl is host-only (#3638): a repository's .pragent.toml can no longer set it. Configure it on the host instead, for example with PRAGENTEXTRACONFIG_URL.
- commitablecodesuggestions is now committablecodesuggestions (#3749): the old spelling still works with a deprecation warning until 1.0.
- The Bitbucket Server webhook image runs under gunicorn (#3667): the container now starts multiple workers through the shared gunicorn_config.py instead of a single Python process.
Known issue: Bedrock Kimi K3, new in this release (#3651), still receives a temperature by default, which Bedrock is reported to reject. Until #3752 lands, add the model ids to config.notemperaturemodels.
What's Changed
- Run BitBucket Server webhook under gunicorn for worker isolation by @jkratz55 in #3667
- test: pin LiteLLM future Claude fallbacks by @PeterDaveHello in #3660
- test(ai\_handlers): add tripwire for guarded private LiteLLM imports by @utsab345 in #3615
- test: use the bundled LiteLLM cost map in local unit runs by @akalongman in #3641
- fix(codecommit): align language classification with diff packing by @oleksii-tumanov in #3625
- refactor(cloud\_auth): deduplicate repeated logic by @high-tail in #3607
🚀 Features
- feat(gitlab): distinguish applied and bot-resolved suggestion threads in the improve context by @JokeWaumans in #3774
- feat: add Bedrock Kimi K3 models by @ira-at-work in #3651
- feat: reply to GitLab trigger discussions by @deadpool-mjpatel4444 in #3426
- feat(gitlab): support inline key issues by @utsab345 in #3650
- feat(ai\_handlers): surface prompt cache visibility by @utsab345 in #3618
- feat(models): add Claude Opus 5.5 support by @PeterDaveHello in #3629
- feat: validate /describe output against existing model by @taljeon in #3616
🐛 Bug Fixes
- fix(git\_providers): log publish and settings errors at quiet verbosity by @PeterDaveHello in #3802
- fix(tickets): cap fetched sub-issues per ticket and order parent before children by @rishiiicreates in #3807
- fix(models): clamp OpenRouter Gemini reasoning disablement by @oleksii-tumanov in #3787
- fix(tools): re-raise any provider incomplete-files error, not just Bitbucket's by @PranavD2905 in #3800
- fix(bitbucket): encode filenames in line links by @kudala-bharani in #3796
- fix(servers): route inline comments to /ask\_line only on a leading /ask by @utsab345 in #3797
- fix(review): link a TODO without a usable line number to its file by @Arta-shoja in #3788
- fix: stop caching repo context on a mutable ref by @utsab345 in #3776
- fix(typo): commitable to committable by @even-even in #3749
- fix(action): share GitHub helpers so the Action keeps the #3670 /ask fix by @Yoel-qin in #3785
- fix(github): fetch newest polling comments by @oleksii-tumanov in #3747
- fix(labels): build the label enum when no custom labels are set by @utsab345 in #3773
- fix(tokens): drop dangling bytes when fitting truncated prompt text by @Yoel-qin in #3771
- fix(providers): encode filenames in line links by @oleksii-tumanov in #3782
- fix(changelog): make fence stripping idempotent by @utsab345 in #3783
- fix(gitlab): classify concurrent changelog creation by @oleksii-tumanov in #3786
- fix(bitbucket): reject incomplete aggregate pull request diffs by @oleksii-tumanov in #3743
- fix: stop three silent fallbacks that corrupt review and label output by @utsab345 in #3744
- fix: preserve findings when inline positions cannot be resolved by @strawberry-little-bear in #3753
- fix(changelog): preserve concurrent edits during changelog updates by @oleksii-tumanov in #3751
- fix(azure): apply ignore patterns to slash-prefixed paths by @utsab345 in #3770
- fix(mosaico): honor streaming requirements in health probes by @PeterDaveHello in #3781
- fix(servers): require a leading slash for comment commands by @Yoel-qin in #3769
- fix(bitbucket): apply ignore filters to push commands by @Yoel-qin in #3768
- fix(codecommit): prepare comment bodies in publish\code\suggestions by @truecallerabreham in #3736
- fix(tickets): preserve branch issue order by @oleksii-tumanov in #3766
- fix: detect language for multi-part and uppercase suffixes by @utsab345 in #3767
- fix(gitea): delete every temp comment on cleanup by @utsab345 in #3765
- fix: fail closed on three silent fallbacks by @utsab345 in #3742
- fix(github): invalidate stale non-empty diff caches by @PeterDaveHello in #3724
- fix(github): fetch all direct sub-issues by @oleksii-tumanov in #3746
- fix(azure): do not resolve a comment thread after a swallowed tool failure by @Lesereingrape in #3722
- fix(github\_action): fail the Action when a tool records a swallowed failure by @charlieanna in #3712
- fix(gitlab): stop search\_line from raising UnboundLocalError by @utsab345 in #3756
- fix(gerrit): reject unsupported reflect webhook action by @oleksii-tumanov in #3748
- fix(improve): match applied entries when capping history by @utsab345 in #3735
- fix(improve): keep generation and reflection chunks aligned by @oleksii-tumanov in #3740
- fix(openrouter): normalize routing variants in capability checks by @PeterDaveHello in #3728
- fix(azure): keep the incremental diff on the source branch by @utsab345 in #3758
- fix(tests): harden Gitea E2E branch naming and timeouts by @PeterDaveHello in #3664
- fix(bitbucket): report line counts in describe by @utsab345 in #3727
- fix(add\_docs): report failed inline documentation publication by @oleksii-tumanov in #3745
- fix(add\_docs): anchor docstring indentation on a code line by @utsab345 in #3733
- fix(gitea): separate commit messages by @utsab345 in #3729
- fix(github): strip only the leading ask command by @utsab345 in #3732
- fix(agent): treat hash as text in commands by @utsab345 in #3731
- fix: record failures from swallowed auto-command tools by @sb123sb123 in #3710
- fix(codecommit): use the PR URL region for AWS requests by @oleksii-tumanov in #3715
- fix(bitbucket): resolve settings branches to commit hashes by @oleksii-tumanov in #3711
- fix(diff): a deletion-only diff is dropped from the compressed prompt with no bookkeeping by @utsab345 in #3699
- fix(ask): preserve apostrophes in double-quoted questions by @oleksii-tumanov in #3698
- fix(diff): preserve deleted file metadata when pruning by @PeterDaveHello in #3697
- fix(commands): preserve automatic command setting overrides by @oleksii-tumanov in #3696
- fix(gitlab): skip incomplete submodule comparisons by @oleksii-tumanov in #3695
- fix(tokens): avoid a stale cached encoder on concurrent model switch by @utsab345 in #3694
- fix(cli\_args): reject forbidden keys hidden in section mapping values by @utsab345 in #3648
- fix(ignore): stop renames bypassing ignore rules on GitLab and Bitbucket by @utsab345 in #3693
- fix(mosaico): parse quoted diff paths by @deadpool-mjpatel4444 in #3441
- fix(lit
v0.46.02026-09-21
What's Changed
🚀 Features
- feat(status): acknowledge a pull request the moment automatic commands start by @dwin-gharibi in #3091
- feat(gitlab): content-based auto-resolve for fixed inline threads by @Nie1iX in #3478
- feat(tickets): make description issue matching configurable by @utsab345 in #3385
- feat: register Grok 4.3 reasoning effort by @deadpool-mjpatel4444 in #3425
- feat(context): load repo-context files from sibling repos (same namespace/owner) by @utsab345 in #3362
- feat: add typed prompt output models by @utsab345 in #3371
- feat: per-directory .pr\_agent.toml for monorepo settings by @utsab345 in #3282
- feat(improve): recover failed chunks with fallback models by @junnhwan in #3324
- feat(jira): add project-key allowlist to skip lookups for key-shaped noise by @Fayupable in #3304
- feat: add Jira ticket-context support by @dellch in #2420
- feat(telemetry): expose a native prometheus scrape endpoint by @utsab345 in #3238
- feat: generalize org-level settings to all providers via get\owning\namespace by @utsab345 in #3143
- feat(models): route small pull requests to a cheaper primary model by @ylcn91 in #3104
- feat(artifacts): read the CI artifact context from the CLI as well by @ylcn91 in #3105
- feat(models): add Claude Fable 5.1 support by @PeterDaveHello in #3101
- feat(models): add OpenAI GPT-6 Astra support by @PeterDaveHello in #3087
- feat(push\_outputs): route describe and improve output to the configured sinks by @dwin-gharibi in #3098
- fix(tickets): bound the shorthand issue-number match at six digits, matching the branch pattern by @dwin-gharibi in #3082
- feat(reactions): configurable start and outcome reactions by @dwin-gharibi in #3089
- feat(review): publish sanitized failure reasons by @elijahchancey in #2996
🐛 Bug Fixes
- fix: check pinecone upsert response by @utsab345 in #3561
- fix: preserve quoting in CLI and configured Action commands by @oleksii-tumanov in #3585
- fix(github): send label names to the set-labels endpoint by @utsab345 in #3582
- fix: point shipped docs links at live targets by @utsab345 in #3556
- fix(diff): preserve source lines containing EOF marker text by @PeterDaveHello in #3572
- fix(codecommit): apply ignore rules and read .pr\_agent.toml from the destination commit by @PeterDaveHello in #3576
- fix(polling): log worker capacity waits by @PeterDaveHello in #3574
- fix(similar\_issue): treat a blank qdrant url as unset by @utsab345 in #3551
- fix(similar\_issue): honor max issues scan limit by @mote24405-coder in #3565
- fix(similar\_issue): let a second repository join an existing lancedb table by @utsab345 in #3563
- fix(similar\_issue): make lancedb search and ingest match the other backends by @utsab345 in #3562
- fix: namespace pinecone similar issue by @utsab345 in #3560
- fix(similar\_issue): stop lancedb duplicating the sentinel row by @utsab345 in #3558
- fix(similar\_issue): keep the best hit per issue so the comment lists stay aligned by @utsab345 in #3557
- fix(similar\_issue): list all lancedb tables instead of the deprecated 10-name call by @utsab345 in #3553
- fix: preserve generated changelog after write failures by @oleksii-tumanov in #3529
- fix(similar\_issue): skip null comment bodies before splitting by @utsab345 in #3549
- fix: resolve the PR head SHA through a provider hook (#3431) by @sloemo01 in #3528
- fix: invert lancedb ingest table check by @utsab345 in #3531
- fix(gitlab): narrow broad exception handlers in the GitLab provider by @wfatih in #3525
- fix(gpt5): clamp reasoning\_effort 'max' where xhigh is unsupported by @auroraxo in #3273
- fix: redact sensitive AWS Secrets Manager error logs by @PeterDaveHello in #3512
- fix(tests): validate Gitea E2E file writes and tool results by @PeterDaveHello in #3513
- fix: keep tags in reasoning support probe by @utsab345 in #3502
- fix(litellm): support adaptive thinking for profile ARNs by @rajin-khan in #3497
- fix(github-action): propagate command failure status by @Sanchar127 in #3486
- fix(bitbucket): surface source write failures by @oleksii-tumanov in #3500
- fix(suggestions): allow required imports in improvements by @noooooooookro in #3169
- fix: prevent changelog overwrite after read failures by @oleksii-tumanov in #3495
- fix: derive reasoning\_effort support from litellm metadata (#3480) by @utsab345 in #3485
- fix(azure): retry renamed files at incremental checkpoint by @oleksii-tumanov in #3489
- fix(gitlab): migrate to paginated merge request diffs (GitLab 15.7 or later) by @oleksii-tumanov in #3491
- fix(codecommit): use merge base for analysis by @oleksii-tumanov in #3493
- fix(bitbucket): split raw diffs at file headers by @oleksii-tumanov in #3492
- fix: redact AWS credential discovery errors from logs by @PeterDaveHello in #3487
- fix(github): surface incomplete file-set errors by @oleksii-tumanov in #3488
- fix(azure): preserve original content for renamed files by @oleksii-tumanov in #3465
- fix(github): pass event=COMMENT to create\_review so inline reviews are not left PENDING by @utsab345 in #3482
- fix(config): honor reasoning\_effort for OpenAI-compatible endpoints by @utsab345 in #3460
- fix(azure): render /improve suggestions as a diff block by @utsab345 in #3424
- fix(config): fence description\issue\regex as host-only by @utsab345 in #3476
- fix(tests): use Gitea branch API in E2E test by @PeterDaveHello in #3481
- fix(github): apply ignore filters to incremental file views by @PeterDaveHello in #3447
- fix: remove orphaned claude-3-5-sonnet MAX\_TOKENS entry by @utsab345 in #3471
- fix(github): reject incomplete pull request file lists by @oleksii-tumanov in #3467
- fix(azure): collect complete pull request changes by @oleksii-tumanov in #3463
- fix(docs): keep persistent\inline\comments meaning in config reference by @TianHengZhuang in #3455
- fix(gitlab): honor --config-branch / PR\AGENT\CONFIG\BRANCH when loading .pr\agent.toml by @JokeWaumans in #3453
- fix(models): ignore empty fallback entries by @deadpool-mjpatel4444 in #3444
- fix(local-git): use new path for renamed files by @deadpool-mjpatel4444 in #3442
- fix(azure): preserve nested source branch names by @deadpool-mjpatel4444 in #3440
- fix(config): detect Git worktree roots by @deadpool-mjpatel4444 in #3437
- fix: remove dead claude-3-5-sonnet model shortcut by @utsab345 in #3458
- fix(review): apply the security label using the same predicate as the review body by @utsab345 in #3419
- fix(providers): url-encode branch names in git provider links by @utsab345 in #3422
- fix: fit final prompts per model attempt by @oleksii-tumanov in #3395
- fix: prepare AWS credentials off the event loop by @PeterDaveHello in #3380
- fix(polling): isolate per-comment settings via request\cycle\context by @utsab345 in #3430
- fix(gitlab): preserve context lines in suggestions by @noooooooookro in #3168
- fix(improve): require complete improved\_code without ellipsis by @utsab345 in #3421
- fix(labels): gate get\pr\labels behind get\_labels support by @utsab345 in #3420
- fix(github): use committer date for incremental review commit range after rebase by @utsab345 in #3417
- fix: retry only failed chunks in large PR reviews by @utsab345 in #3402
- fix(add\_docs): clear the progress comment and report when no documentation was produced by @dwin-gharibi in #2915
- fix(security): scrub provider tokens from cloned repositories by @utsab345 in #3398
- fix(bitbucket): enable inline key issue deduplication by @utsab345 in #3387
- fix: budget diff packing per model attempt by @oleksii-tumanov in #3389
- fix: correct MAX\_TOKENS entries understating LiteLLM's context window (#3196) by @MostafaHassanzadeh in #3329
- fix(labels): validate output inside model attempts by @oleksii-tumanov in #3393
- fix(bitbucket): hide review and suggestion identity markers by @utsab345 in #3386
- fix: package help documentation corpus by @ole
v0.45.02026-09-05
What's Changed
🚀 Features
- feat(review): preserve findings across review reruns by @yefuyou in #2722
- feat(improve): cap suggestions per file after chunk aggregation by @junnhwan in #3034
- feat(git-providers): add public register\git\provider by @ylcn91 in #3023
- feat(github): trigger commands after submitted reviews by @junnhwan in #3011
- feat(review): add opt-in large-diff chunking with a stated merge rule by @ylcn91 in #3013
- Add support for Gemini 3.8 Flash by @takotakot in #3003
- feat: opt-in to skip same-model retry on timeout by @derrix060 in #2995
- feat(codecommit): review all pull request targets by @junnhwan in #2993
- feat(azure): preserve suggestion state across reruns by @TLA020 in #2724
- feat(skills): apply configured skills to top-level ask by @junnhwan in #2967
- feat: LiteLLM usage stats integration via otel for external monitoring systems by @jong47 in #2201
- feat: fall back to LiteLLM metadata for max tokens by @yashaskn8 in #2970
- feat: provider-agnostic push outputs for review (stdout/file/webhook/slack) by @shmulc8 in #2510
- Add review risk assessment and optional repository review rules by @xiaodeng666a in #2391
- feat(gitlab): add publish\improve\as\_thread option by @sirluky in #2723
🐛 Bug Fixes
- fix(tickets): refresh prompt budgets after extraction by @oleksii-tumanov in #3036
- fix(gitea): resolve base\url\html on first use so a repo-level web\_url applies by @ylcn91 in #3029
- fix(improve): validate committable Python suggestions by @swayamg20 in #3046
- fix(bitbucket): parse patches from hunk headers by @oleksii-tumanov in #3032
- fix(gerrit): require webhook credentials on every call by @ylcn91 in #3027
- fix(gitea): walk every page of PR files and commits by @ylcn91 in #3022
- fix(servers): compare basic-auth credentials as bytes and fail closed on a half-configured pair by @ylcn91 in #3028
- fix(pr\_agent/algo/utils.py): trust only pr-agent's own pyproject.toml for the version by @YokoAC in #3007
- fix(ci): harden release input validation by @PeterDaveHello in #2997
- fix(gitlab): skip suggestions pointing past blanked head content by @dongwonmoon in #3015
- fix(gerrit): return commit messages as text by @adongwanai in #3016
- fix: enable describe large-diff chunking prompts by @yashaskn8 in #3006
- fix(bitbucket): report code suggestion publish status by @oleksii-tumanov in #2992
- fix(qdrant): namespace the collection so pre-#2323 points cannot surface by @prakrititz in #2991
- fix: align CLI settings validation with repo allowlist by @mikemikimike in #2964
- fix(bitbucket): harden webhook credential handling by @PeterDaveHello in #2988
- fix: default auto approval to disabled by @nightcityblade in #2980
- fix: handle Gitea inline comment API errors by @chuanxu742-glitch in #2975
- fix(github): cast app\_id to str so GitHub App auth works on PyJWT >=2.11 by @7487 in #2969
- fix(gitea): report success/failure and submit reviews, not drafts by @space-josh in #2878
- fix(gerrit): clean up failed repository setup by @Junaid-PK in #2926
- fix(docker): restore the pr-agent console script in the cli image by @IsmaelMartinez in #2936
- fix: sanitize Mermaid diagrams in PR descriptions by @swayamg20 in #2819
- fix: guard against empty commit list in Azure DevOps get\latest\commit\_url by @Rehan30g in #2940
- fix(review): guard label updates by provider capability by @askarshabdanov1-collab in #2938
- fix(providers): normalize inverted line ranges by @RRXXZZYY in #2939
- fix(fallback): restore deployment after model retries by @junnhwan in #2929
- fix(similar-issue): scope optional vector imports by @Elioooon in #2927
- fix(pr\_agent/algo/utils.py): returning an empty dict when every yaml fallback fails by @dwin-gharibi in #2730
- fix(gitlab): handle null webhook labels by @RRXXZZYY in #2922
- fix(pr\agent/config\loader.py): coercing verbosity\_level to int by @dwin-gharibi in #2909
- fix(pr\_agent/algo/utils.py): preferring an exact line match when anchoring a comment by @dwin-gharibi in #2905
- fix(suggestions): align fallback chunks after conversion failure by @YaoSong808 in #2867
- fix(qdrant): add pandas dep, fix cross-repo ID collisions, fix comment indexing by @gvago in #2323
- fix: redact git credentials from clone failure logs by @dwin-gharibi in #2697
- fix: share language matcher with plain diff provider by @apoorvdarshan in #2895
- fix(gerrit): use action parameter for dispatch and clean up temp repos by @gvago in #2331
- fix(pr\agent/tools/pr\similar\_issue.py): migrating embeddings to the openai v1 client by @dwin-gharibi in #2726
- fix: bound language filename matching by @lxingy3 in #2846
📚 Documentation
- docs: sync GitBook navigation with MkDocs by @VedanthB in #3044
- docs: make provider support matrix single-source by @VedanthB in #3043
- docs(security): discourage baking secrets into images by @PeterDaveHello in #3019
- docs: make configuration defaults authoritative by @Ricky-7-Yan in #3000
- docs(usage-guide): note importable-env requirement for CLI commands by @dongwonmoon in #2990
- docs(usage-guide): add extension guide and fill contributor onboarding gaps by @dongwonmoon in #2966
- docs: clarify OSS best practices configuration by @Ricky-7-Yan in #2870
🧹 Maintenance
- chore: unskip B005, B009, B012, B905 ruff rules by @even-even in #3060
- tests: build file:// URLs with Path.as\_uri() to fix Windows failures by @bunnysayzz in #3055
- chore: unskip E713, E714, E721 ruff rules by @even-even in #3053
- test: use importlib mode for pytest test imports by @PeterDaveHello in #3018
- test(git-providers): extend the cross-provider contract to four more methods by @ylcn91 in #3024
- chore: unskip actionlint pre-commit and fix warnings by @even-even in #3001
- refactor: generate provider-prefixed Claude model ids by @yashaskn8 in #3004
- refactor(prompts): share diff-hunk guidance across tools by @swayamg20 in #2994
- test: limit default pytest discovery to unit tests by @PeterDaveHello in #2987
- chore: fold github\_action Dockerfile and coverage workflow into existing definitions by @7487 in #2989
- test: add cross-provider get\line\link contract by @swayamg20 in #2984
- test: cover the pr\review\prompt user-half variable contract by @Rehan30g in #2950
- test: run ASGI unit tests without TestClient by @PeterDaveHello in #2948
- test: remove loopback socket dependency from extra-config unit tests by @PeterDaveHello in #2947
⬆️ Dependencies
- fix: relax uvicorn version constraint by @mallesh-bot in #3020
- fix(deps): update lancedb for Python 3.14 resolution by @devnp2007 in #2983
- chore(deps): Upgrade LiteLLM to the latest stable v1.99.0 by @PeterDaveHello in #2981
Full Changelog: https://github.com/The-PR-Agent/pr-agent/compare/v0.44.0...v0.45.0
v0.44.02026-08-30
⚠️ Important Changes
- GitHub App webhooks now require a configured secret (#2595): getbody() no longer accepts unsigned webhooks — a deployment without GITHUB.WEBHOOKSECRET set is rejected with HTTP 403 instead of trusting every caller. Set the secret on your GitHub App and in your config before upgrading. The same PR escapes attacker-controlled webhook fields that were interpolated into CLI command strings.
- Dependency management migrated to uv (#2509): requirements.txt, requirements-dev.txt, and the legacy setup.py are gone — dependencies now live in pyproject.toml with a committed uv.lock. Set up a dev environment with uv sync and run tools via uv 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 with uv sync --frozen. Installing from PyPI with pip install pr-agent still works.
- Linting consolidated on Ruff (#2880): flake8 and the standalone isort pre-commit hook were removed. Contributors should run uv run ruff check --fix on 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(models): add OpenRouter router model support by @PeterDaveHello in #2893
- feat(litellm): support Claude adaptive thinking by @Kyzcreig in #2531
- Support triggering commands via review assignment in Gitlab by @igoraj in #2388
- feat(models): support Grok 4.5/4.6 on xAI and OpenRouter by @PeterDaveHello in #2871
- 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(pr\agent/servers/gerrit\server.py): requiring credentials on the webhook route by @dwin-gharibi in #2728
- fix: harden webhook auth and CLI argument injection vectors by @wjc2821296948 in #2595
- fix: preserve YAML keys and values during fallback parsing by @yifanxiong272 in #2877
- fix: surface the triggering workflow's conclusion in workflow\_run reviews by @afonsojanu in #2848
- fix(improve): avoid false failure after inline publish by @Fnine59 in #2886
- fix(github): handle pull requests without commits by @Fnine59 in #2888
- fix: add None safety for optional fields in GitLab webhook handlers by @wishhyt in #2276
- fix(improve): avoid false failure after successful publish by @Fnine59 in #2882
- 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-ghar
v0.43.02026-08-22
> [!NOTE]
> PyPI releases are back. pr-agent is published to PyPI again as part of the release workflow — this release is available as pr-agent 0.43.0. The versions missed during the gap (0.40.0, 0.41.0, 0.42.0) have been backfilled as well.
>
> ``bash
> pip install pr-agent==0.43.0
> ``
What's Changed
🚀 Features
- feat(config): accept max reasoning effort by @Kyzcreig in #2529
- feat: add Asana ticket detection to ticket compliance check by @Oxygen56 in #2430
- feat(azure): publish review findings inline by @TLA020 in #2651
- feat(webhooks): add feedback\on\draft\_pr to run auto commands on draft PRs by @kvdb in #2659
- feat(gitlab): incremental /review -i and /improve -i by @sizickp in #2389
- Add support for Gemini 3.7 Flash by @takotakot in #2657
🐛 Bug Fixes
- fix(azure): span complete suggestion lines by @TLA020 in #2721
- fix(suggestions): remove stale progress comments by @TLA020 in #2648
- fix: compare configuration skip keys case-insensitively by @dwin-gharibi in #2689
- fix: render a trailing deletion-only hunk instead of dropping it by @dwin-gharibi in #2683
- fix: parse omitted hunk counts in find\line\number\of\relevant\line\in\_file by @dwin-gharibi in #2699
- fix: treat an omitted unified-diff hunk count as 1, not 0 by @dwin-gharibi in #2677
- fix: return 401 instead of 500 for an unauthenticated Azure DevOps webhook by @dwin-gharibi in #2703
- fix: match the litellm callback probe record by identity by @dwin-gharibi in #2693
- fix: read config.skip\_keys from the correct settings path by @dwin-gharibi in #2687
- fix: stop lowercasing the whole comment body in the GitHub Action runner by @dwin-gharibi in #2691
- fix: strip whitespace before validating forbidden CLI arguments by @dwin-gharibi in #2675
- fix: authenticate GitLab webhooks in the request path so failures return 401 by @dwin-gharibi in #2708
- fix(description): use regex for minute suffix replacement instead of blanket .replace by @gvago in #2318
- fix: render tickets requiring only human verification by @Fnine59 in #2654
- fix: select the correct old-file lines for /ask on a LEFT-side diff line by @dwin-gharibi in #2679
- fix: drop deletion-only hunk when a later hunk has additions by @bunnysayzz in #2621
- fix: keep DefaultDictWithTimeout key timestamps in sync with its entries by @dwin-gharibi in #2685
- fix(local): support detached HEAD in LocalGitProvider by @SAY-5 in #2670
- fix(gitea): use user-facing base URL for links published in comments by @niallsemple in #2617
- fix: allow importing get\logger as the first pr\agent import by @AshSgDe29071999 in #2704
- fix(azure): anchor inline comments to diff paths by @TLA020 in #2647
- fix: update stale unreviewed\files\set references to unreviewed\files\map in tests by @lesbass in #2711
- fix(ticket-compliance): fetch linked issues from their own repository by @higher68 in #2533
- fix: include agent run details in /improve output when no suggestions are found by @YokoAC in #2653
- fix(improve): route self-reflection through the reasoning fallback chain (#2660) by @IsmaelMartinez in #2661
📚 Documentation
- docs(gitlab): clarify pipeline and webhook workflows by @hansu650 in #2636
- docs: pin current GitHub install source by @er-s-an in #2655
- docs: document local git provider workflow by @yefuyou in #2665
- docs: remove wiki configuration file, which this repo does not implement by @IsmaelMartinez in #2666
- docs: remove interactive checkbox claims that this repo does not implement (#2541) by @IsmaelMartinez in #2615
🧹 Maintenance
- chore(deps): Upgrade LiteLLM to the latest stable v1.96.2 by @PeterDaveHello in #2638
- test: isolate Gunicorn tests from runner CPU affinity by @PeterDaveHello in #2613
Full Changelog: https://github.com/The-PR-Agent/pr-agent/compare/v0.42.0...v0.43.0
v0.42.02026-08-08
What's Changed
🚀 Features
- feat(litellm): pass-through cache\control\injection\_points for Anthropic prompt caching by @naorpeled in #2610
- feat: add GLM-5.2, Kimi K3, Qwen3.8 and MiMo v2.5 model support by @PeterDaveHello in #2606
- feat: add opt-in agent run details section (model, tokens, time, AI calls) by @victorljii in #2587
- feat(review): surface files excluded from review coverage by @yefuyou in #2589
- feat(gitlab): add option to publish /review output as a resolvable threads by @aivarsliepa in #2545
- feat(describe): add enable\pr\description to skip the AI summary by @vaibzde in #2570
- feat(describe): make the changes-diagram direction configurable and adaptive by @IsmaelMartinez in #2598
🐛 Bug Fixes
- fix: per-request settings clone in bitbucket-server \& azuredevops webhooks (#2345) by @alonz101 in #2351
- fix(gitlab): anchor inline comments to the latest diff version by @IsmaelMartinez in #2600
- fix(gitlab): keep persistent /improve thread stable when it has replies by @IsmaelMartinez in #2404
- fix(gitlab): report get\issue\comments as supported so /answer works by @IsmaelMartinez in #2599
- fix(gitea): resolve last\_commit from PR commits, not repo commits by @vaibzde in #2569
- fix: correct LiteLLM OTel dependency guard import path by @PeterDaveHello in #2607
🧹 Maintenance
- chore(deps): Upgrade LiteLLM to the latest stable v1.95.0 by @PeterDaveHello in #2611
Full Changelog: https://github.com/The-PR-Agent/pr-agent/compare/v0.41.1...v0.42.0
v0.41.12026-08-01
> [!NOTE]
> v0.41.1 isn't on PyPI yet. We're working on getting it published and will update this note as soon as it lands. In the meantime, pip install pr-agent==0.41.1 won't resolve — use one of these instead:
>
> Docker — images for 0.41.1 are available now:
> ``bash
> docker pull pragent/pr-agent:0.41.1 # CLI
> docker pull pragent/pr-agent:0.41.1-github_app # per-target images use the same -<target> suffix
> `
>
> Install from source at the tag:
> `bash
> pip install "git+https://github.com/The-PR-Agent/pr-agent.git@v0.41.1"
> `
> This installs the v0.41.1 code, though it currently self-reports 0.39.0.
>
> Or stay on pr-agent==0.39.0` until we confirm here that 0.41.1 is available.
What's Changed
🚀 Features
- feat: support the /improve command for the local git provider by @YokoAC in #2583
- feat: optional provider-side request attribution via the OpenAI user field by @FabrizioCafolla in #2584
🐛 Bug Fixes
- fix(litellm): surface the real provider error instead of RetryError by @naorpeled in #2586
- fix: fall back to old path when diff\item.b\path is None in LocalGitProvider by @YokoAC in #2581
📚 Documentation
- docs(usage-guide): add Neon AI Gateway model configuration by @mezotv in #2568
- docs: refresh stale docs against the current release line by @agonzalesipcoop-cmyk in #2571
🧹 Maintenance
- chore(mosaico): pin the deployment bundle to 0.41.0 by @ofir-frd in #2566
- ci(mosaico): remove the bundle-parity check by @ofir-frd in #2567
Full Changelog: https://github.com/The-PR-Agent/pr-agent/compare/v0.41.0...v0.41.1