Skip to content

Release v1.27.1 - #3646

Closed
ak684 wants to merge 2 commits into
mainfrom
rel-1.27.1
Closed

Release v1.27.1#3646
ak684 wants to merge 2 commits into
mainfrom
rel-1.27.1

Conversation

@ak684

@ak684 ak684 commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Patch release: v1.27.0 + cherry-pick of #3586 (fix(llm): don't emit explicit cache_control markers for Gemini) only.

Cut for the OpenHands Enterprise 1.39.0 release so OHE installs get the Gemini prompt-caching fix without the rest of post-1.27.0 main. Release will be published from this branch per the README-RELEASE process; this PR is for visibility and is not intended to merge to main (version files would conflict with the next main release).


Agent Server images for this PR

GHCR package: https://github.com/OpenHands/agent-sdk/pkgs/container/agent-server

Variants & Base Images

Variant Architectures Base Image Docs / Tags
java amd64, arm64 eclipse-temurin:17-jdk Link
python amd64, arm64 nikolaik/python-nodejs:python3.13-nodejs22-slim Link
golang amd64, arm64 golang:1.21-bookworm Link

Pull (multi-arch manifest)

# Each variant is a multi-arch manifest supporting both amd64 and arm64
docker pull ghcr.io/openhands/agent-server:430ef64-python

Run

docker run -it --rm \
  -p 8000:8000 \
  --name agent-server-430ef64-python \
  ghcr.io/openhands/agent-server:430ef64-python

All tags pushed for this build

ghcr.io/openhands/agent-server:430ef64-golang-amd64
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-golang-amd64
ghcr.io/openhands/agent-server:rel-1.27.1-golang-amd64
ghcr.io/openhands/agent-server:430ef64-golang_tag_1.21-bookworm-amd64
ghcr.io/openhands/agent-server:430ef64-golang-arm64
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-golang-arm64
ghcr.io/openhands/agent-server:rel-1.27.1-golang-arm64
ghcr.io/openhands/agent-server:430ef64-golang_tag_1.21-bookworm-arm64
ghcr.io/openhands/agent-server:430ef64-java-amd64
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-java-amd64
ghcr.io/openhands/agent-server:rel-1.27.1-java-amd64
ghcr.io/openhands/agent-server:430ef64-eclipse-temurin_tag_17-jdk-amd64
ghcr.io/openhands/agent-server:430ef64-java-arm64
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-java-arm64
ghcr.io/openhands/agent-server:rel-1.27.1-java-arm64
ghcr.io/openhands/agent-server:430ef64-eclipse-temurin_tag_17-jdk-arm64
ghcr.io/openhands/agent-server:430ef64-python-amd64
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-python-amd64
ghcr.io/openhands/agent-server:rel-1.27.1-python-amd64
ghcr.io/openhands/agent-server:430ef64-nikolaik_s_python-nodejs_tag_python3.13-nodejs22-slim-amd64
ghcr.io/openhands/agent-server:430ef64-python-arm64
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-python-arm64
ghcr.io/openhands/agent-server:rel-1.27.1-python-arm64
ghcr.io/openhands/agent-server:430ef64-nikolaik_s_python-nodejs_tag_python3.13-nodejs22-slim-arm64
ghcr.io/openhands/agent-server:430ef64-golang
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-golang
ghcr.io/openhands/agent-server:rel-1.27.1-golang
ghcr.io/openhands/agent-server:430ef64-golang_tag_1.21-bookworm
ghcr.io/openhands/agent-server:430ef64-java
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-java
ghcr.io/openhands/agent-server:rel-1.27.1-java
ghcr.io/openhands/agent-server:430ef64-eclipse-temurin_tag_17-jdk
ghcr.io/openhands/agent-server:430ef64-python
ghcr.io/openhands/agent-server:430ef6469e7d146876a6f5af1f1f18636a4d696f-python
ghcr.io/openhands/agent-server:rel-1.27.1-python
ghcr.io/openhands/agent-server:430ef64-nikolaik_s_python-nodejs_tag_python3.13-nodejs22-slim

About Multi-Architecture Support

  • Each variant tag (e.g., 430ef64-python) is a multi-arch manifest supporting both amd64 and arm64
  • Docker automatically pulls the correct architecture for your platform
  • Individual architecture tags (e.g., 430ef64-python-amd64) are also available if needed

@github-actions

Copy link
Copy Markdown
Contributor

Python API breakage checks — ✅ PASSED

Result:PASSED

Action log

@github-actions

Copy link
Copy Markdown
Contributor

REST API breakage checks (OpenAPI) — ✅ PASSED

Result:PASSED

Action log

@github-actions

Copy link
Copy Markdown
Contributor

Evaluation Triggered

  • Trigger: Release v1.27.1
  • SDK: 430ef64
  • Eval limit: 50
  • Models: claude-sonnet-4-5-20250929

@all-hands-bot all-hands-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ QA Report: PASS WITH ISSUES

SDK behavior was exercised directly: Gemini formatting no longer emits explicit cache_control markers, Anthropic explicit caching still does, and installed package metadata reports 1.27.1.

Does this PR achieve its stated goal?

Yes. The stated goal is a patch release v1.27.1 containing the Gemini prompt-caching fix without the rest of post-1.27.0 main; running the SDK against the v1.27.0 baseline produced two Gemini cache_control markers, while the PR branch at 430ef646 produced zero for the same litellm_proxy/gemini-3.1-pro-preview input. The release version metadata also reports 1.27.1 for all four editable packages. CI was not fully green at the time of QA, so this is a functional pass with release-readiness caveat.

Phase Result
Environment Setup make build completed and installed the editable packages
CI Status ⚠️ gh pr checks showed 1 failing, 14 successful, 2 skipped, 23 pending
Functional Verification ✅ Gemini markers removed; Anthropic markers preserved; package metadata is 1.27.1
Functional Verification

Test 1: Gemini explicit cache markers are removed

Step 1 — Reproduce / establish baseline without the fix:
Ran the v1.27.0 SDK source in a temporary worktree with the same user-style SDK operation: instantiate LLM(model="litellm_proxy/gemini-3.1-pro-preview", caching_prompt=True), format a system/user/assistant/user message history, and count emitted cache_control keys.

git worktree add --detach /tmp/oh-sdk-v1270 v1.27.0
OPENHANDS_SUPPRESS_BANNER=1 PYTHONPATH=/tmp/oh-sdk-v1270/openhands-sdk \
  /home/runner/work/software-agent-sdk/software-agent-sdk/pr-repo/.venv/bin/python - <<'PY'
# Instantiate Gemini LLM with caching_prompt=True, call format_messages_for_llm,
# count cache_control markers in formatted message/block payloads.
PY

Observed output:

baseline_tag=v1.27.0
model=litellm_proxy/gemini-3.1-pro-preview
is_caching_prompt_active=True
cache_control_marker_count=2
cache_control_markers=[(0, 0, {'type': 'ephemeral'}), (3, 0, {'type': 'ephemeral'})]
roles=system,user,assistant,user

This confirms the old v1.27.0 behavior: Gemini was treated as explicit prompt-caching-active and emitted cache markers on both the system prefix and the last user turn.

Step 2 — Apply the PR's changes:
The repository was already checked out on rel-1.27.1 at 430ef6469e7d146876a6f5af1f1f18636a4d696f.

Step 3 — Re-run with the fix in place:
Ran the equivalent SDK operation on the PR branch:

uv run python - <<'PY'
# Same Gemini LLM/message formatting operation as the baseline run.
PY

Observed output:

model=litellm_proxy/gemini-3.1-pro-preview
is_caching_prompt_active=False
cache_control_marker_count=0
cache_control_markers=[]
roles=system,user,assistant,user

This shows the PR delivers the core fix: with caching_prompt=True, Gemini no longer activates explicit prompt caching and no cache_control markers are emitted in the payload that the SDK formats for LiteLLM.

Test 2: Anthropic explicit prompt caching still emits markers

Ran the same SDK formatting operation on the PR branch with model="claude-sonnet-4-20250514":

OPENHANDS_SUPPRESS_BANNER=1 uv run python - <<'PY'
# Instantiate Anthropic LLM with caching_prompt=True, call format_messages_for_llm,
# count cache_control markers in formatted message/block payloads.
PY

Observed output:

model=claude-sonnet-4-20250514
is_caching_prompt_active=True
cache_control_marker_count=2
cache_control_markers=[(0, 0, {'type': 'ephemeral'}), (3, 0, {'type': 'ephemeral'})]
roles=system,user,assistant,user

This checks the nearest related behavior: explicit cache markers remain active for an Anthropic model, so the Gemini exclusion did not disable the intended Anthropic path.

Test 3: Installed release package metadata is 1.27.1

Ran:

OPENHANDS_SUPPRESS_BANNER=1 uv run python - <<'PY'
from importlib.metadata import version
for package in [
    "openhands-sdk",
    "openhands-agent-server",
    "openhands-tools",
    "openhands-workspace",
]:
    print(f"{package}={version(package)}")
PY

Observed output:

openhands-sdk=1.27.1
openhands-agent-server=1.27.1
openhands-tools=1.27.1
openhands-workspace=1.27.1

This confirms a user installing/building this branch sees the expected patch-release version across the editable packages.

Issues Found

  • 🟠 Release readiness caveat: CI was not fully green when checked (Persisted settings compatibility checks/Persisted settings failing; 23 checks pending). No functional issue was found in the manually exercised Gemini caching behavior, but this release PR should wait for CI to finish/resolve before publication.

This QA review was created by an AI agent (OpenHands) on behalf of the user.

@github-actions

Copy link
Copy Markdown
Contributor

Coverage

Coverage Report •
FileStmtsMissCoverMissing
openhands-sdk/openhands/sdk/llm
   llm.py84013284%531, 547, 580–581, 866–867, 870–874, 876, 884–886, 890, 907–908, 912, 914–915, 917–919, 1042, 1165, 1358, 1367–1369, 1468, 1479, 1520, 1532–1534, 1537–1540, 1546, 1604, 1615, 1658, 1671–1673, 1676–1679, 1685, 1864–1869, 1985–1986, 2326–2327, 2336, 2354, 2378–2379, 2381, 2383, 2385, 2393, 2396, 2398, 2400, 2408, 2412–2413, 2423–2427, 2431, 2435–2436, 2441, 2445, 2451, 2456, 2497, 2499–2504, 2506–2523, 2526–2530, 2532–2533, 2539–2548, 2605, 2607
openhands-sdk/openhands/sdk/llm/utils
   model_features.py64198%38
TOTAL31252668878% 

@VascoSch92

Copy link
Copy Markdown
Member

@ak684 can you use the next release? It is almost done i think

Cc @enyst

@enyst

enyst commented Jun 10, 2026

Copy link
Copy Markdown
Member

@ak684 It seems we already tagged? We should not tag before the release PR is ready.

Also the tag has a failure in CI. 😢

Could we please announce a release PR in the Slack channel? And notify people

@enyst

enyst commented Jun 10, 2026

Copy link
Copy Markdown
Member

Error: Failed to generate baseline payloads from openhands-sdk==1.27.1, openhands-agent-server==1.27.1 with exclude-newer=2026-06-10T20:35:09.477424Z: × No solution found when resolving dependencies:
╰─▶ Because there is no version of openhands-sdk==1.27.1 and you require
openhands-sdk==1.27.1, we can conclude that your requirements are
unsatisfiable.

Sounds like this is because the tagged version was first

@enyst enyst left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just a moment Alona, to figure this out. I think you started the release without OpenHands using its skill?

Normally we tell it to start a release PR, and it knows to also label it and stuff

@enyst

enyst commented Jun 10, 2026

Copy link
Copy Markdown
Member

@ak684 @VascoSch92 We merged the minor release, and it contains this commit. Do you still a special patch only for that commit? If yes, maybe we can tell OH exactly to make a release PR for patching 1.27.0 with this commit, to make 1.27.2, and have the process play out. The workflows are almost fully automated, and please note: it will also tag when merged.

I'm guessing the initial tag that already went out, well, it will be out there. 😅

@ak684

ak684 commented Jun 10, 2026

Copy link
Copy Markdown
Contributor Author

oof sorry team! I let my agent run to try and get a release out for OHE with specific fixes and walked away and it clearly caused havoc here, i apologize!

@ak684 ak684 closed this Jun 10, 2026
@enyst

enyst commented Jun 10, 2026

Copy link
Copy Markdown
Member

Hah, tiny bit o' havoc 😅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants