Open-source contributions to LLM infrastructure, made through my forks:
AaronG18/langgraph → langchain-ai/langgraph · AaronG18/litellm → BerriAI/litellm
Sep - Nov 2026
Everything below is work I submitted to an upstream project from my own fork: fixes, regression tests, performance analyses, and issue triage. My own repositories are intentionally not listed on this page.
| Pull request | What I changed | Status |
|---|---|---|
| #49885 | calculate_request_duration() returned None for audio uploads passed as (filename, pathlib.Path(...)) tuples. The tuple branch handled bytes and file objects but not os.PathLike, so transcription duration was silently missing. The fix reads the path content inside that branch and adds a regression test (+34 lines, 2 files). Fixes #49805. |
Open - BerriAI CLA signed; awaiting maintainer review |
| #49979 | azure_ai/claude-mythos-5-1 had no row in model_prices_and_context_window.json, so the azure_ai provider lookup rejected the model and the proxy recorded zero spend. Added the entry using Anthropic's published per-token rates plus a regression test (+70/-1, 2 files). Fixes #49865. |
Closed 2026-11-05 - superseded by upstream #50245, a registry audit that already added the row |
I also posted QA findings on #49884 (Redis circuit breaker stuck in HALF_OPEN on a non-connectivity probe failure) and #49805. On #49884 another contributor already had a complete patch and tests ready, so I yielded the implementation to them instead of competing.
SDK reliability (November 2026)
- #9625 -
thread.output.with_timeout(s)cancelled the stream's shared_run_donefuture._fetch()passed_wait_for_run_done()straight intoasyncio.wait_for, and that function awaits the shared future directly, so a timeout cancellation propagated into_run_doneitself: the originalthread.outputthen raisedCancelledErrorforever and a later run failure was hidden. The fix wraps that wait inasyncio.shield(...), matching the shield pattern already used elsewhere in the same module. One behavioural line plus a regression test that is red before the fix and green after; 80 stream tests pass. Fixes #9609.
Several of the 25 PRs are re-submissions of the same fix after the upstream issue-link bot closed the first one; the distinct work is grouped below.
State, checkpoint, and store correctness
- #8799 / #8980 -
InMemoryStoretreated dotted filter keys such asuser.access-levelas literal top-level keys. Resolve them against nested values, matchingSqliteStorebehaviour (#7795). - #8812 - SQLite stores ignored per-operation TTL
refreshflags in batched reads. Align batch and single-item flag resolution withBaseStoreandPostgresStore(#8806). - #8844 / #8878 - public
__all__import test suite that fails with the exact list of non-importable symbols when the advertised API drifts (#5810).
Graph and runtime correctness
- #8800 / #8981 -
StateGraph.compile()mutatedStateNodeSpecobjects in place and leaked its generated error-handler node into the builder, so compiling the same builder twice raised. Apply defaults to copies (#8612). - #8982 - resolve a runtime-injected
storewhenupdate_state/aupdate_stateexecutes a conditional-edge router or node (#6340). - #9295 - a
@taskawaited inside aStateGraphnode resolved toNoneunderastream_eventswhileainvokereturned the value. Fix task result resolution on the streaming path (#9284).
Performance in the Pregel loop
- #8856 / #8877 -
_scratchpadscannedpending_writestwice per candidate task. Resolve the task-independent resume write once per superstep: O(tasks x writes) → O(tasks + writes) (#8855). - #8858 -
put_writesrescanned every channel per task forUntrackedValue. Compute the check once, since channels are fixed for the run (#8857). - #8860 -
on_donecalledshould_stopon the accumulateddoneset, rescanning k futures on the k-th completion. Check only the newly finished future: O(tasks^2) → O(tasks) (#8859).
API surface and guardrails
- #8868 -
stream_mode="messages"streamed everyBaseMessagein state, leaking internal reasoning channels to clients. Add a configurable state-key restriction, wired into both the sync and async paths, with tests (#6798). - #8849 / #8874 - private channels stay checkpointed and restorable but are excluded from
get_state/get_state_history(#8644). - #8848 / #8873 - input validators at compile time, applied in both
update_stateandaupdate_state(#7119). - #8847 / #8872 - bind run context at the graph level instead of requiring
context=on every invoke (#7990). - #8846 / #8875 - per-node call counting and configurable limits, raising
NodeCallLimitErroron runaway invocations (#5883).
Reliability and error reporting
- #9456 - retry transient
httpxread/connect/protocol errors and timeouts in the SDK HTTP clients instead of propagating the raw exception (#5819). - #8845 / #8876 - preserve the structured server payload in
RemoteExceptioninstead of flattening it to one line (#2559).
Upstream issues I opened
- #8855, #8857, #8859 - three Pregel-loop performance analyses with complexity measurements.
- #8861 - an order-dependent flaky test that fails only in the full suite.
- Commented on 24 upstream issues and 4 pull-request threads in
langchain-ai/langgraph: reproduction details, sync/async parity, cross-store consistency, and regression-test notes. - Where another contributor had a complete patch ready, I did QA and yielded the implementation rather than opening a competing PR.
- Every change is documented in an English contribution-log issue on my fork (20 logs so far): AaronG18/langgraph issues. Each log records the upstream link, what changed, quantitative evidence, and test results.
None of these pull requests has been merged yet.
langchain-ai/langgraphruns arequire-issue-linkbot that closes external PRs on the day they are opened unless the author is assigned to the linked issue. 24 of the 25 September-October PRs were closed by that bot. #8868 is the one still open: after I was assigned to #6798 it was reopened, and community review is complete - a reviewer found a realstate_keysbug in the v2 streaming handler, I fixed it, and the same reviewer confirmed the fix; two further reviews verified the field filter and the rebase. It is waiting on maintainer review.- On
BerriAI/litellm, #49885 is open (BerriAI CLA now signed; awaiting maintainer review) and #49979 was closed as superseded. - #9625 was closed by the
require-issue-linkbot on 2026-11-07 (single commit, 2 files, +34/-1,mergeable=True), because #9609 is not yet assigned to me. I requested assignment on the issue with the root cause and fix; the bot reopens the PR automatically once a maintainer assigns it. No code change is outstanding on my side.

