Repository navigation
AutoTriage 5 works with Claude, OpenAI, Gemini and any OpenAI-compatible service, replaces the fast and review model tiers with a single model, and fails on invalid inputs instead of quietly running with something else.
Highlights
-
Any model provider. Map
ANTHROPIC_API_KEYorOPENAI_API_KEYinstead ofGEMINI_API_KEY, or setOPENAI_BASE_URLfor any OpenAI-compatible service. Every provider now goes through one Chat Completions client, which replaces@google/genai. (#178, #181, #182, #183) -
Runs you can trust.
- Every run writes a job summary showing what was acted on, what failed and what wasn't reached.
- The job goes red only for configuration errors, fatal model errors (bad key, unknown model, no credit) and bugs. Provider overloads and GitHub outages only warn.
- Each model call is bounded by a 15-minute deadline, and a used-up daily quota fails the item at once instead of being retried for minutes.
- An item that changes during analysis is re-analyzed once. If it keeps changing, the summary names the skipped plan and says to re-run the job.
-
Simpler setup. The policy and README are read through the API, so workflows no longer need
actions/checkout. One event workflow now covers new issues, pull requests and comments, and the quick start grants the right permissions and queues runs instead of cancelling them. (#230, #221, #186) -
Better triage decisions.
- Commits and reviews are dated correctly in the timeline, so they no longer crowd out recent comments.
- Archived labels are no longer offered to the model, and model replies are validated before any operation is applied.
- Items that try to steer the bot are treated as spam, and comments that do are ignored.
- The built-in policy adds every label an item strongly supports.
Upgrading
v5 collapses the two model tiers into one and rejects invalid configuration instead of ignoring it. The steps below are the changes most workflows hit, and the rest are in the list below.
-
Replace the two model tiers with one
model. Every item now gets a single analysis, somodel-fastandmodel-probecomemodel, andmax-fast-runsandmax-pro-runsbecomemax-runs(default 50). Items that fail count towardmax-runs, and a re-analysis spends one more. A blankmodeluses the default for the API key you map. (#217, #226) -
Remove
extendedandstrict-mode. Both inputs are gone, and a workflow that still passes them gets GitHub's unexpected-input warning. Backlog sweeps now always do whatextended: truedid, and runs with failed items stay green. Fatal model errors and bugs still fail the job. (#218, #191) -
Map one API key, or set
model. With one key mapped, every model name goes to that provider. With several keys mapped,gemini-*andclaude-*names go to their own provider and any other name goes to OpenAI orOPENAI_BASE_URL. A blankmodelwith several keys mapped now fails at startup and names the keys, where before the first key in the order Gemini, Anthropic, OpenAI won silently. (#183, #210) -
Fix input values that used to be ignored. These now fail the run before anything is triaged, and the error names the value:
dry-runmust betrueorfalse, soyesno longer runs live.issuesmust be positive numbers, optionally prefixed with#, separated by spaces or commas. A typo no longer turns an explicit list into a backlog sweep.max-runsmust be a whole number above 0, andbudget-scalea number of 0 or more.- A custom
prompt-paththat is in neither the workspace nor the repository fails the run instead of falling back to the built-in policy.
-
Drop Gemini-only settings.
GOOGLE_GEMINI_BASE_URLis no longer read, and backlog context caching and the flex tier are gone. Gemini's reasoning text no longer appears in the log or the hidden comment block, which now show the plan's summary and the policy clause behind each operation. (#183) -
Update anything that reads
run-summary.json. The file is now written under that name instead of0-run-summary.json, withschemaVersion5 and a single model, prompt hash and usage block. Deferred items have their own outcome, and fields such asskipReasonandgithub.retriesare removed. (#190, #183, #217)
These release notes were initially generated by Nuntia. Learn more
What's Changed
- Strengthen the test suite by @danielchalmers in #174
- Test the entry point and keep prompt fixtures out of tests/ by @danielchalmers in #176
- Drop dead repository-context fallbacks from getConfig by @danielchalmers in #175
- chore: update dependencies by @danielchalmers in #173
- chore: update dependencies by @danielchalmers in #177
- Stop long Gemini calls failing at 5 minutes by @danielchalmers in #179
- Validate model output before applying operations by @danielchalmers in #180
- Replace @google/genai with an owned Gemini client by @danielchalmers in #181
- Support Claude, OpenAI, and any OpenAI-compatible model provider by @danielchalmers in #182
- Replace per-provider model adapters with OpenAI-compatible client by @danielchalmers in #183
- Run this repo's own workflows on Claude by @danielchalmers in #184
- Stop the unit tests printing missing-prompt warnings by @danielchalmers in #185
- Fix the quick start and examples for how GitHub runs them today by @danielchalmers in #186
- Reject invalid dry-run and issues values instead of running live by @danielchalmers in #188
- Date commits and reviews correctly in the timeline, and drop event ids and URLs from the prompt by @danielchalmers in #189
- Derive run statistics from per-item records by @danielchalmers in #190
- Write a job summary every run, and fail the job only for configuration errors and bugs by @danielchalmers in #191
- Re-analyze an item once when it changes during analysis by @danielchalmers in #192
- Delete the remaining dead code by @danielchalmers in #193
- Bound and report model-call time in the shared client by @danielchalmers in #194
- Isolate and quiet the unit tests by @danielchalmers in #195
- Use Haiku 5.5 for both CI model tiers by @danielchalmers with @Copilot in #198
- chore: update dependencies by @danielchalmers in #199
- Run unit tests on every pull request, and cancel superseded CI runs by @danielchalmers in #200
- Hide archived labels from the model by @danielchalmers in #209
- Fail when model-pro is blank and several API keys are mapped by @danielchalmers in #210
- Stop a missing policy file from silently falling back to the built-in policy by @danielchalmers in #213
- Explain in the README that labels need descriptions by @danielchalmers in #214
- Clarify the example policy's inactivity rules by @danielchalmers in #216
- Replace the two model tiers with one model input and one max-runs cap by @danielchalmers in #217
- Remove the extended input, and always revisit older items in sweeps by @danielchalmers in #218
- Rewrite and trim README by @danielchalmers in #220
- Switch to one workflow for all new activity by @danielchalmers in #221
- Don't tell the model an item without a triage record is a first review by @danielchalmers in #222
- Note that the example policy's inactivity rules need a stale label by @danielchalmers in #223
- Ask the built-in policy for every label the item strongly supports by @danielchalmers in #224
- Stop waiting on a used-up daily quota, and retry replies that carry an error by @danielchalmers in #225
- Count failed items toward max-runs, and fail on invalid max-runs or budget-scale by @danielchalmers in #226
- Clean up fast/pro split leftovers, Compute run stats once, Drop chalk by @danielchalmers in #227
- Stop storing plan summary in triage history, Drop pre-v4 history format by @danielchalmers in #228
- Read policy and README through API, so workflows need no checkout by @danielchalmers in #230
- Have the model write down the facts the policy turns on before it plans by @danielchalmers in #232
- Treat items that try to steer the triage bot as spam, and ignore comments that do by @danielchalmers in #233
- Name the skipped plan and how to recover it when an item keeps changing, and save empty plans by @danielchalmers in #234
- Run Nuntia v2 when a release is published, so it writes AutoTriage's release notes by @danielchalmers in #231
Full Changelog: v4...v5