Commit graph

55654 commits

Author SHA1 Message Date
Devin AI
84adc800f6 refactor(redis): move the auth cache invalidation codec into a store module 2026-10-30 21:53:34 +00:00
Devin AI
2d1d5e92fb refactor(redis): move config sync pub/sub behind a typed store 2026-10-30 21:51:27 +00:00
Devin AI
47db6b2ead refactor(redis): move batch charge markers behind a typed store 2026-10-30 21:44:23 +00:00
Devin AI
5733bbc834 refactor(redis): move Claude session router bindings behind a typed store 2026-10-30 21:16:14 +00:00
Devin AI
11befbda31 refactor(redis): move global router usage behind a typed store 2026-10-30 21:16:14 +00:00
Devin AI
d661f655b8 refactor(redis): move scheduler queue snapshots behind a typed store 2026-10-30 21:13:01 +00:00
Devin AI
99f3ec1838 refactor(redis): migrate agent MCP permission links to typed store 2026-10-30 21:13:01 +00:00
Devin AI
e03e42fedd refactor(redis): migrate user MCP permission links to typed store 2026-10-30 21:13:01 +00:00
Devin AI
06affb432f refactor(redis): isolate managed object metadata store 2026-10-30 21:13:01 +00:00
Devin AI
90b8da7dca refactor(redis): isolate managed vector resource metadata store 2026-10-30 21:13:00 +00:00
Devin AI
18ce857411 refactor(redis): isolate managed file metadata store 2026-10-30 21:13:00 +00:00
Devin AI
39d0fcc26c fix(redis): preserve shared health seconds expiry 2026-10-30 20:28:44 +00:00
Devin AI
69a516138e refactor(redis): extract shared health store 2026-10-30 19:41:20 +00:00
Devin AI
0b0fcd06de fix(redis): send MCP marker and refresh lock scripts with plain EVAL 2026-10-30 19:40:36 +00:00
Devin AI
fa70556719 feat(redis): expose existing command batch lifecycle hooks 2026-10-30 19:29:26 +00:00
Devin AI
99726e881d feat(redis): add explicit non-retrying direct eval transport 2026-10-30 19:29:26 +00:00
Devin AI
50c756de06 fix(redis): preserve failure provenance and strict batch policy 2026-10-30 19:29:26 +00:00
Devin AI
5b7f7125c2 feat(redis): add native seconds transport expiry commands 2026-10-30 19:29:09 +00:00
Devin AI
d373b499df test(redis): exercise strict import boundaries with Ruff 2026-10-30 19:09:46 +00:00
Devin AI
42e6169dc4 test(redis): retain enqueued reservation codec coverage 2026-10-30 19:09:43 +00:00
Devin AI
f9fa29b0b0 test(redis): retain MCP marker failure and wire compatibility 2026-10-30 18:38:31 +00:00
Devin AI
d73aff25a4 test(redis): retain refresh lock compatibility coverage 2026-10-30 18:35:36 +00:00
Devin AI
d9e1399363 build(redis): guard the redis-py import boundary
Co-authored-by: Yujong Lee <yujong@berri.ai>
2026-10-30 18:26:28 +00:00
Yujong Lee
3c1b5749d2 refactor(redis-store): enqueued-token store encodes and decodes the reservation record 2026-10-30 18:26:28 +00:00
Devin AI
bceb75d727 refactor(redis-store): migrate batch enqueued-token accounting
Co-authored-by: Yujong Lee <yujong@berri.ai>
2026-10-30 18:26:28 +00:00
Devin AI
bb2fe927cd refactor(redis-store): move session iteration counts behind a store
Co-authored-by: Yujong Lee <yujong@berri.ai>
2026-10-30 18:26:27 +00:00
Yujong Lee
04b9b45914 fix(redis-store): session spend reads keep main's outcome per failure kind 2026-10-30 18:26:26 +00:00
Devin AI
a838a5a503 refactor(redis-store): move session budgets behind a store
Co-authored-by: Yujong Lee <yujong@berri.ai>
2026-10-30 18:26:26 +00:00
Yujong Lee
ca87d4e6e3 refactor(redis-store): login throttle store takes the source group and username, not keys 2026-10-30 18:26:26 +00:00
Devin AI
e0c2ec6522 refactor(redis-store): move login throttling behind a store
Co-authored-by: Yujong Lee <yujong@berri.ai>
2026-10-30 18:26:26 +00:00
Yujong Lee
b8e43df44b refactor(redis-store): refresh locks take a user and server target, the store owns the key 2026-10-30 18:26:25 +00:00
Devin AI
89d9a7649e refactor(redis-store): migrate MCP credential refresh locks
Co-authored-by: Yujong Lee <yujong@berri.ai>
2026-10-30 18:26:25 +00:00
Yujong Lee
1e6d4d265b refactor(redis-store): single-use markers own their keys, callers pass the marker 2026-10-30 18:26:25 +00:00
Devin AI
a42177a644 refactor(redis-store): migrate MCP single-use markers
Co-authored-by: Yujong Lee <yujong@berri.ai>
2026-10-30 18:26:25 +00:00
Yujong Lee
01038214d3 fix(redis-store): keep the GET+DEL release fallback when the pod lock script cannot run 2026-10-30 18:26:25 +00:00
Yujong Lee
1bd2ff7e63 refactor(redis-store): move the pod lock keyspace behind a store
Cron job locks now go through the shared Redis transport behind TransportPodLockStore, which owns the lock keys, the owner codec and the compare-and-delete release script. PodLockManager.is_held replaces the three direct lock reads in the budget reset, PTU rollup and spend capture-rate jobs and owns the rule that an unreadable lock counts as unheld. Old and new pods respect each other's locks
2026-10-30 18:26:25 +00:00
Yujong Lee
911ddf8ead fix(redis-store): keep main's polling bytes and per-failure outcomes 2026-10-30 18:26:24 +00:00
Yujong Lee
59b04e1c9f refactor(redis-store): move response polling state behind a store
Background response polling state now goes through the shared Redis transport behind TransportResponsePollingStore, which owns the keys, codec and expiry. The wire format is kept byte for byte so old and new pods read each other's state
2026-10-30 18:26:24 +00:00
Yujong Lee
2a964a58d0 docs(skills): stores take domain inputs, callers keep per-kind failure outcomes
Some checks failed
Cost map pins recheck / rerun-cost-map-guard (push) Has been cancelled
LiteLLM Rust DB / db-queries (push) Has been cancelled
LiteLLM Rust / rust-lint (push) Has been cancelled
LiteLLM Rust / rust-test (push) Has been cancelled
LiteLLM Rust / rust-wheel (push) Has been cancelled
2026-10-30 18:26:24 +00:00
Yujong Lee
6a208ed271 feat(redis): cover every Python Redis use on the transport
The transport now has every data command Python sends, request-scoped and
explicit batches on the one pipeline engine RedisBatch already used,
MULTI/EXEC batches, pub/sub, and the admin and health commands. RedisBatch
declares onto the same engine, so moved and unmoved callers in one request
still share one round trip. Cluster mget goes through the cache's
mget_nonatomic path instead of a cross-slot MGET.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 18:26:24 +00:00
Yujong Lee
77129e4f92 refactor(redis): move the response polling store into its own PR
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 18:26:24 +00:00
Yujong Lee
2c69496b96 docs(skills): inline redis-access migration order
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 18:26:24 +00:00
Yujong Lee
2db8c2ef94 docs(skills): make redis-access skill standalone
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 18:26:24 +00:00
Devin AI
1b379855c1 test(redis): isolate the no-callback transport case 2026-10-30 18:26:24 +00:00
Devin AI
facaebccb2 fix(redis): register transport tests and pass CI gates 2026-10-30 18:26:23 +00:00
Yujong Lee
fe2f2f0e9d refactor(redis): make the helpers the transport imports public 2026-10-30 18:26:23 +00:00
Yujong Lee
d5f8d0f9f6 refactor(redis): plain-method transport, store layer and response polling store
Rework RedisTransport into plain get, mget, set, delete and eval methods,
split the breaker step (run_under_breaker over the existing
_run_under_circuit_breaker) from the events step (RedisServiceEvents.observe,
which skips the stack walk and event when no service_callback is set), and
add eval with EVALSHA plus EVAL fallback. Fold in the store layer and the
response polling store, and replace the redis-access skill references with
the migration plan and PR sketches.
2026-10-30 18:26:23 +00:00
Yujong Lee
d546f18a5a refactor(redis-transport): add RedisTransport with a redis-py backend
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 18:26:23 +00:00
Kerry Lu
d23af8bdd0
fix(cost): bill the margin once on rebuilt streams and streamed Responses through the chat bridge (#49254)
* fix(cost): bill the margin once on rebuilt streams and streamed Responses through the chat bridge

The last usage chunk and the Responses terminal event carry litellm's bill in usage.cost, and two readers took that bill for the upstream's own charge and margined it again: completion_cost on a stream_chunk_builder result, and stamp_responses_usage_cost on the chat bridge. The stamp now keeps the upstream's usage.cost under the hidden upstream_usage_cost key, the chunk builder carries it onto the rebuilt response, and the Responses stamp prices that saved figure

* fix(cost): hand the Responses stamp the upstream charge through upstream_usage_cost only, never the response-cost header

response_cost_calculator returns the response-cost header as the final bill without the margin, so a priced copy carrying the upstream's raw usage.cost there billed the client the unmargined figure. The hidden upstream_usage_cost key already feeds billed_usage_cost, which margins it once. The Responses test now prices through a real Logging object instead of a mocked calculator

* fix(cost): leave stamp_responses_usage_cost as on main

The Responses chat bridge copies the inner stream's final usage chunk, so the wrapper stamp keeping upstream_usage_cost already prices it once. Changing the Responses stamp was not needed for that and re-priced xai MCP rounds whose usage.cost is already litellm's bill (0.00512 for 0.00312 in test_xai_stream_auto_execute_bills_each_round_at_its_own_price_with_one_fixed_margin)

---------

Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-30 11:24:49 -07:00
Kerry Lu
840c83b403
test: bedrock claude prompt caching on /v1/messages reports and charges cache tokens (#49265)
* test: bedrock claude prompt caching on /v1/messages reports and charges cache tokens

* ci: re-run after ci-coverage and assert-shard-coverage were cancelled by the GitHub Actions incident

---------

Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-30 11:19:08 -07:00