mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-01 02:02:20 +00:00
get_message(timeout=None) kept returning None after one empty poll slice, so an unbounded wait ended after a second. It now keeps polling until a message arrives async_subscribe closes the pubsub when SUBSCRIBE fails, so a checked-out pool connection is handed back instead of stranded The script_load/evalsha branch in script registration was unreachable: the async RedisCluster client has register_script in every supported redis-py release, and the branch would have passed an unawaited coroutine as the SHA. It is removed along with the mock test that pinned it, and the lock tests now also run against a real one-node Redis Cluster The Redis compat workflow now also triggers on changes to RedisCache and the lock Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
104 lines
4.1 KiB
YAML
104 lines
4.1 KiB
YAML
name: "Unit Tests: Redis Client Version Compatibility"
|
|
|
|
on:
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
- "litellm_**"
|
|
paths:
|
|
- "litellm/_redis.py"
|
|
- "litellm/_redis_credential_provider.py"
|
|
- "tests/test_litellm/test_redis.py"
|
|
- "tests/local_testing/test_caching.py"
|
|
- "tests/test_litellm/caching/test_redis_connection_pool.py"
|
|
- "litellm/caching/redis_cache.py"
|
|
- "litellm/proxy/_experimental/mcp_server/outbound_credentials/redis_distributed_lock.py"
|
|
- "tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_redis_distributed_lock.py"
|
|
- ".github/workflows/test-redis-compat.yml"
|
|
- "pyproject.toml"
|
|
- "uv.lock"
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
redis-compat:
|
|
name: "redis-py ${{ matrix.redis-version }}"
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
permissions:
|
|
contents: read
|
|
id-token: write
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# 5.3.1 is the version pinned in uv.lock (redisvl caps it below 6); the
|
|
# newer legs prove the inspect.signature introspection in litellm/_redis.py
|
|
# keeps extracting kwargs on the redis-py releases people actually run now.
|
|
# Only the exact release 6.0.0 is skipped: rq (pulled by the proxy extra)
|
|
# specifies `redis != 6`, which excludes 6.0.0 alone, so 6.4.0 stands in
|
|
# for the 6.x line.
|
|
redis-version: ["5.3.1", "6.4.0", "7.4.1", "8.0.1"]
|
|
|
|
steps:
|
|
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- name: Set up uv
|
|
uses: ./.github/actions/setup-uv-with-retries
|
|
with:
|
|
version: "0.10.9"
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
.github/scripts/uv_sync_with_retries.sh --frozen --group ci --group proxy-dev --extra google --extra proxy --extra extra_proxy --extra semantic-router
|
|
|
|
- name: Pin redis-py to the matrix version
|
|
env:
|
|
REDIS_VERSION: ${{ matrix.redis-version }}
|
|
run: |
|
|
uv pip install "redis==${REDIS_VERSION:?}"
|
|
uv run --no-sync python -c "import redis; assert redis.__version__ == '${REDIS_VERSION:?}', redis.__version__; print('redis-py', redis.__version__)"
|
|
|
|
- name: Build Redis for cluster authentication tests
|
|
run: |
|
|
curl --fail --location --retry 3 https://download.redis.io/releases/redis-7.2.16.tar.gz -o "$RUNNER_TEMP/redis-7.2.16.tar.gz"
|
|
echo "960a8ec15e34ff40e57ff16837b26b33bd81f2da6d24497bb63de532a323a18e $RUNNER_TEMP/redis-7.2.16.tar.gz" | sha256sum --check
|
|
tar -xzf "$RUNNER_TEMP/redis-7.2.16.tar.gz" -C "$RUNNER_TEMP"
|
|
make -C "$RUNNER_TEMP/redis-7.2.16" -j2 MALLOC=libc OPTIMIZATION=-O1 redis-server
|
|
echo "$RUNNER_TEMP/redis-7.2.16/src" >> "$GITHUB_PATH"
|
|
|
|
- name: Run redis unit tests
|
|
run: |
|
|
redis-server --version
|
|
uv run --no-sync pytest \
|
|
tests/test_litellm/test_redis.py \
|
|
tests/test_litellm/caching/test_redis_connection_pool.py \
|
|
tests/test_litellm/proxy/_experimental/mcp_server/outbound_credentials/test_redis_distributed_lock.py \
|
|
tests/local_testing/test_caching.py::test_sync_cluster_authenticates_with_azure_credentials \
|
|
tests/local_testing/test_caching.py::test_sync_cluster_authenticates_with_gcp_credentials \
|
|
--tb=short -vv \
|
|
--reruns 2 \
|
|
--reruns-delay 1 \
|
|
--durations=20 \
|
|
--cov=./litellm --cov-report=xml:coverage-redis.xml
|
|
|
|
- name: Upload Redis coverage
|
|
if: matrix.redis-version == '5.3.1'
|
|
uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5.5.4
|
|
with:
|
|
use_oidc: true
|
|
files: coverage-redis.xml
|
|
flags: redis-compat
|
|
fail_ci_if_error: false
|