Skip to content

Make new Release v2.1.0: couchbase>=4.6.4, Python 3.14, CI on Couchbase 7.6 and 8.0 - #13

Merged
VirajAgarwal-couchbase merged 1 commit into
mainfrom
chore/lifecycle-sweep-t_1510b6dc
Nov 6, 2026
Merged

VirajAgarwal-couchbase merged 1 commit into
mainfrom
chore/lifecycle-sweep-t_1510b6dc

Conversation

@dex-the-ai

@dex-the-ai dex-the-ai commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Monthly Couchbase Ecosystem lifecycle sweep for langgraph-checkpointer-couchbase (Hermes Kanban couchbase-ecosystem / t_1510b6dc, run 2026-11-05T090023Z).

Before making changes I read the manifest entry and the repo's AGENTS.md. Following the AGENTS.md rules, this PR bumps the version, uses the Make new Release title, keeps hatch/pip, and adds no lockfile.

Version

  • Old: 2.0.0, which is current on PyPI. New: 2.1.0 (minor).
  • Why minor: this adds Python 3.14 support, which is new but backward-compatible. The SDK floor raise is a patch-level floor raise inside 4.6.x.
  • After merge, a maintainer must run the "Publish Package to PyPI" workflow (release.yaml) on main. The draft GitHub release v2.1.0 is published by that workflow.

Changes

Item Before After
couchbase (Python SDK) floor >=4.6.3 >=4.6.4 (latest, released 2026-10-28)
Python classifiers 3.10–3.13 3.10–3.14 (couchbase 4.6.4 ships cp314 wheels)
CI matrix py3.10–3.13 × couchbase:enterprise-7.6.4 py3.10–3.14 × enterprise-7.6.12, enterprise-8.0.3 (10 jobs)
pytest-asyncio warning that the default fixture loop scope is unset asyncio_default_fixture_loop_scope = "function"
README requirements SDK 4.6.3+ SDK 4.6.4+
__version__ 2.0.0 2.1.0

Couchbase SDK: 4.6.4 is the latest release. The fix most relevant to this package is PYCBC-1954: "acouchbase closes the caller's running event loop while resolving it". In 4.6.3, LoopValidator could close() a running loop it considers invalid, and the 4.6.4 fix returns the running loop unchanged. AsyncCouchbaseSaver connects through acouchbase. The release also carries 13 other client fixes (close-path lifecycle, request timeouts, exception messages, and others).

Other direct dependencies: I left the floors unchanged because none of them needs a raise. The latest versions resolve and pass: langgraph 1.2.20 (langgraph-checkpoint 4.3.1), langchain 1.4.9, langchain-core 1.7.6, langchain-openai 1.7.4, pydantic 2.14.3, typing_extensions 4.16.0, python-dotenv 1.2.4, reo-census 0.2.0. The current floors still pass too (see the floor run below).

GitHub Actions: no change needed. checkout@v7, setup-python@v7, labeler@v7 and pypa/gh-action-pypi-publish@release/v1 are already the latest majors. Dependabot reports no open alerts.

Validation

Couchbase ran in containers with no published ports, and the tests ran in python:<v>-slim --network container:<cb>. Each run did the CI-equivalent setup: a test bucket and langgraph scope, the README indexes, pytest tests/test_checkpointer.py tests/test_python_version_guard.py, then hatch build.

Couchbase Python Dependencies Result
7.6.12 3.10 floors: couchbase 4.6.4, langgraph 1.0.5, langchain/-core/-openai 1.1.3, pydantic 2.12.5, reo-census 0.1.2 6 passed, build OK (2.1.0 sdist+wheel)
7.6.12 3.12 latest 6 passed, build OK
8.0.3 3.14 latest 6 passed, build OK
7.6.4 / 8.0.3 3.13 / 3.10 latest, on main before this change 6 passed (baseline)

Manual validation (README sync and async flows, live OpenAI)

On each of Couchbase 8.0.3 (Python 3.13) and 7.6.12 (Python 3.10), I did the following with a fresh task-scoped bucket lgcp_t1510 and scope readme:

  1. The saver created the checkpoints and checkpoint_writes collections, and I created the README indexes idx_checkpoints_thread and idx_checkpoint_writes_thread on (thread_id, checkpoint_ns, checkpoint_id).
  2. I extracted the README Quick Start, Synchronous Usage and Asynchronous Usage code blocks verbatim and ran them with gpt-5-mini.
    • Sync, thread 1: 5 checkpoints were written. get, get_tuple and list read them back, and the final AI message was "…always sunny in SF".
    • Async, thread 2: 5 checkpoints. aget, aget_tuple and alist worked, and the reply was "It might be cloudy in NYC."
    • Resume: a new AsyncCouchbaseSaver.from_conn_info continued sync thread 1. Asked "which city did I ask about first?", the agent answered sf, so the checkpoint persisted across savers and connections.
  3. python tests/agent_e2e_test.py: exit 0, with both the sync and async result blocks printed.
  4. Cleanup: before teardown the checkpoints collection held 21 docs on 8.0.3 and 23 on 7.6.12. I ran couchbase-cli bucket-delete --bucket lgcp_t1510, then GET /pools/default/buckets/lgcp_t1510 returned 404 on both clusters.

There is no browser UI surface, so UI evidence is not applicable (per the manifest).

Release process

Classification: manual_github_dispatch, also tag_triggers_release on v*. Evidence: .github/workflows/release.yaml runs on workflow_dispatch or on a v* tag push, and draft-release.yml refreshes the draft on every push to main. Merging does not publish anything. It only refreshes the v2.1.0 draft. No tags, releases or dispatches were made by this sweep.

Risk and rollback

  • Users still on couchbase 4.6.3 will be upgraded to 4.6.4 when they install 2.1.0. This is a patch release of the SDK on the same 4.6 line.
  • The CI job names change to test (pyX, enterprise-…). I found no branch protection or ruleset that requires the old names.
  • Rollback: revert this PR. Nothing is released until the workflow is dispatched.

Reviewers / notification

I requested a GitHub review from @VirajAgarwal-couchbase. The manifest owner handle VirajAgarwal1 is not a repo collaborator (the request returned 422), and VirajAgarwal-couchbase reviewed #8–#10. I sent a Slack owner notification that tags the Slack ID mapped to virajagarwal-couchbase in people.json.

🤖 Generated with Claude Code

…se 7.6 and 8.0

- Raise the couchbase SDK floor to 4.6.4. It includes PYCBC-1954 (acouchbase
  could close the caller's running event loop, which AsyncCouchbaseSaver uses)
  and other client fixes.
- Declare Python 3.14 support. couchbase 4.6.4 ships cp314 wheels.
- CI tests Python 3.10-3.14 against Couchbase Server 7.6.12 and 8.0.3.
- Set pytest-asyncio's default fixture loop scope to silence its deprecation
  warning.
- Bump __version__ to 2.1.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings November 5, 2026 12:51
@github-actions github-actions Bot added documentation Improvements or additions to documentation ci Workflows and release automation dependencies Dependency updates labels Nov 5, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No active review issues remain in the version 2.1.0 release-preparation changes.

No open issues 🎉

What changed in this PR

Prepares version 2.1.0 of the Couchbase checkpointer package with an updated SDK requirement, declared Python 3.14 support, and broader CI coverage. Publishing remains a separate maintainer action after merge.

Changes:

  • Raises the Couchbase SDK minimum to 4.6.4 and updates the documented requirement.
  • Adds Python 3.14 support and expands CI to 10 combinations across Couchbase Server 7.6.12 and 8.0.3.
  • Sets the default pytest async fixture loop scope to function.
File Description
README.md Updates the minimum Couchbase SDK requirement.
pyproject.toml Raises the SDK floor, adds the Python 3.14 classifier, and configures async fixture scope.
langgraph_checkpointer_couchbase/​__about__.py Bumps the package version to 2.1.0.
.github/​workflows/​ci.yaml Expands the Python and Couchbase Server test matrix and names jobs by combination.

Review effort: Balanced

@dex-the-ai

Copy link
Copy Markdown
Collaborator Author

Lifecycle evidence (t_1510b6dc)

Head: 598f47b on chore/lifecycle-sweep-t_1510b6dc
GitHub checks: all 11 pass. The CI run is 42030749909: test on py3.10–3.14 × Couchbase enterprise-7.6.12 / enterprise-8.0.3 (10 jobs, each including hatch build), plus Apply release-note labels.

Local automated runs

Couchbase ran with no published ports, and Python ran in python:<v>-slim --network container:<cb>. Each run: pip install -e . pytest pytest-asyncio hatch [pins] → query readiness → README indexes → pytest tests/test_checkpointer.py tests/test_python_version_guard.py → hatch build.

  • CB 7.6.12 / py3.10 / dependency floors (couchbase 4.6.4, langgraph 1.0.5 + checkpoint 3.0.1, langchain/-core/-openai 1.1.3, pydantic 2.12.5, reo-census 0.1.2): 6 passed, build OK.
  • CB 7.6.12 / py3.12 / latest: 6 passed, build OK.
  • CB 8.0.3 / py3.14 / latest (couchbase 4.6.4, langgraph 1.2.20, checkpoint 4.3.1, langchain 1.4.9, langchain-openai 1.7.4, pydantic 2.14.3, reo-census 0.2.0): 6 passed, build OK.
  • Baseline on main (2.0.0) with the latest dependencies: CB 7.6.4 / py3.13 and CB 8.0.3 / py3.10, 6 passed each.

Manual README validation (live OpenAI gpt-5-mini)

I ran this on CB 8.0.3 / py3.13 and on CB 7.6.12 / py3.10:

  • Setup: couchbase-cli bucket-create --bucket lgcp_t1510 --bucket-ramsize 128 --wait, then collection-manage --create-scope readme. The saver created its collections, then CREATE INDEX idx_{checkpoints,checkpoint_writes}_thread IF NOT EXISTS ON lgcp_t1510.readme.<col>(thread_id, checkpoint_ns, checkpoint_id).
  • README Quick Start + Synchronous Usage (verbatim blocks): PASS. Thread 1 has 5 checkpoints, get, get_tuple and list all work, and the last AI message is "…always sunny in SF."
  • README Asynchronous Usage (verbatim block, acouchbase cluster + from_cluster): PASS. Thread 2 has 5 checkpoints, aget, aget_tuple and alist work, and the reply is "It might be cloudy in NYC."
  • Resume across savers: PASS. A new AsyncCouchbaseSaver.from_conn_info continued thread 1 ("which city did I ask about first?" → sf).
  • python tests/agent_e2e_test.py: exit 0, with both the sync and async result sections printed.
  • Teardown: the checkpoints doc count was 21 on 8.0.3 and 23 on 7.6.12. After couchbase-cli bucket-delete --bucket lgcp_t1510, GET /pools/default/buckets/lgcp_t1510 returned 404 on both. The test containers have been removed.

Harness note: langchain-openai caches its async HTTP client per process, so running two separate asyncio.run() loops in one process fails with "Event loop is closed" inside httpcore. That is a harness artifact, not the checkpointer. The final harness runs all async steps in one loop.

UI evidence: not applicable. The repo has no browser surface, and I did not use the Web Console.

Notifications

  • GitHub review: requested from VirajAgarwal-couchbase. The manifest handle VirajAgarwal1 returned 422 because it is not a collaborator.
  • Slack: sent, tagging the owner's Slack ID.

Limitations

  • Merging does not release anything. A maintainer must run Publish Package to PyPI (release.yaml) on main to ship 2.1.0.
  • The manifest's owner handle (VirajAgarwal1) should be updated to VirajAgarwal-couchbase.

@VirajAgarwal-couchbase VirajAgarwal-couchbase left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@VirajAgarwal-couchbase
VirajAgarwal-couchbase merged commit 5018922 into main Nov 6, 2026
13 checks passed
@VirajAgarwal-couchbase
VirajAgarwal-couchbase deleted the chore/lifecycle-sweep-t_1510b6dc branch November 6, 2026 04:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci Workflows and release automation dependencies Dependency updates documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants