Skip to content

Commit 4278a8f

Browse files
Release v1.19.0 (#2974)
Co-authored-by: openhands <openhands@all-hands.dev>
1 parent 7948984 commit 4278a8f

14 files changed

Lines changed: 118 additions & 202 deletions

File tree

.github/workflows/run-eval.yml

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,7 @@ on:
2424
sdk_ref:
2525
description: SDK commit/ref to evaluate (must be a semantic version like v1.0.0 unless 'Allow unreleased branches' is checked)
2626
required: true
27-
default: v1.18.1
28-
29-
30-
31-
32-
33-
34-
35-
36-
37-
38-
27+
default: v1.19.0
3928
allow_unreleased_branches:
4029
description: Allow unreleased branches (bypasses semantic version requirement)
4130
required: false

AGENTS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ When reviewing code, provide constructive feedback:
116116
- `pr-review-by-openhands` delegates to `OpenHands/extensions/plugins/pr-review@main`. Repo-specific reviewer instructions live in `.agents/skills/custom-codereview-guide.md`, and because task-trigger matching is substring-based, that `/codereview` skill is also auto-injected for the workflow's `/codereview-roasted` prompt.
117117
- The duplicate-issue automation scripts should validate `owner/repo` arguments before interpolating GitHub API paths, handle per-issue auto-close failures without aborting the whole batch, and keep `app_conversation_id` paths unquoted because OpenHands conversation IDs are already canonicalized for those endpoints.
118118
- Auto-title generation should not re-read `ConversationState.events` from a background task triggered by a freshly received `MessageEvent`; extract message text synchronously from the incoming event and then reuse shared title helpers (`extract_message_text`, `generate_title_from_message`) to avoid persistence-order races.
119+
- `RemoteConversation.generate_title()` now reconciles remote events and reuses the shared local `generate_conversation_title(...)` helper instead of calling the removed deprecated agent-server `/generate_title` REST route, so explicit remote title generation still works without a transport-only compatibility endpoint.
120+
119121

120122

121123
## Package-specific guidance

openhands-agent-server/openhands/agent_server/conversation_router.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
ConversationPage,
2020
ConversationSortOrder,
2121
ForkConversationRequest,
22-
GenerateTitleRequest,
23-
GenerateTitleResponse,
2422
SendMessageRequest,
2523
SetConfirmationPolicyRequest,
2624
SetSecurityAnalyzerRequest,
@@ -339,31 +337,6 @@ async def update_conversation(
339337
return Success()
340338

341339

342-
@conversation_router.post(
343-
"/{conversation_id}/generate_title",
344-
responses={404: {"description": "Item not found"}},
345-
deprecated=True,
346-
)
347-
async def generate_conversation_title(
348-
conversation_id: UUID,
349-
request: GenerateTitleRequest,
350-
conversation_service: ConversationService = Depends(get_conversation_service),
351-
) -> GenerateTitleResponse:
352-
"""Generate a title for the conversation using LLM.
353-
354-
Deprecated since v1.11.5 and scheduled for removal in v1.19.0.
355-
356-
Prefer enabling `autotitle` in `StartConversationRequest` to have the server
357-
generate and persist the title automatically from the first user message.
358-
"""
359-
title = await conversation_service.generate_conversation_title(
360-
conversation_id, request.max_length, request.llm
361-
)
362-
if title is None:
363-
raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR)
364-
return GenerateTitleResponse(title=title)
365-
366-
367340
@conversation_router.post(
368341
"/{conversation_id}/ask_agent",
369342
responses={404: {"description": "Item not found"}},

openhands-agent-server/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "openhands-agent-server"
3-
version = "1.18.1"
3+
version = "1.19.0"
44
description = "OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent"
55

66
requires-python = ">=3.12"

openhands-sdk/openhands/sdk/conversation/impl/remote_conversation.py

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
)
2828
from openhands.sdk.conversation.secret_registry import SecretValue
2929
from openhands.sdk.conversation.state import ConversationExecutionStatus
30+
from openhands.sdk.conversation.title_utils import generate_conversation_title
3031
from openhands.sdk.conversation.types import (
3132
ConversationCallbackType,
3233
ConversationID,
@@ -1263,29 +1264,21 @@ def generate_title(self, llm: LLM | None = None, max_length: int = 50) -> str:
12631264
"""Generate a title for the conversation based on the first user message.
12641265
12651266
Args:
1266-
llm: Optional LLM to use for title generation. If provided, its usage_id
1267-
will be sent to the server. If not provided, uses the agent's LLM.
1267+
llm: Optional LLM to use for title generation. If not provided,
1268+
uses the agent's LLM.
12681269
max_length: Maximum length of the generated title.
12691270
12701271
Returns:
12711272
A generated title for the conversation.
12721273
"""
1273-
# For remote conversations, delegate to the server endpoint
1274-
payload = {
1275-
"max_length": max_length,
1276-
"llm": llm.model_dump(mode="json", context={"expose_secrets": True})
1277-
if llm
1278-
else None,
1279-
}
1274+
# Reconcile before reading state so recently posted user messages are
1275+
# visible even if they arrived between the last sync and this call.
1276+
self._state.events.reconcile()
12801277

1281-
resp = _send_request(
1282-
self._client,
1283-
"POST",
1284-
f"{self._conversation_action_base_path}/{self._id}/generate_title",
1285-
json=payload,
1278+
effective_llm = llm if llm is not None else self.agent.llm
1279+
return generate_conversation_title(
1280+
events=self._state.events, llm=effective_llm, max_length=max_length
12861281
)
1287-
data = resp.json()
1288-
return data["title"]
12891282

12901283
def condense(self) -> None:
12911284
"""Force condensation of the conversation history.

openhands-sdk/openhands/sdk/plugin/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def __getattr__(name: str) -> Any:
8080
warn_deprecated(
8181
f"Importing {name} from openhands.sdk.plugin",
8282
deprecated_in="1.16.0",
83-
removed_in="1.19.0",
83+
removed_in="1.21.0",
8484
details="Import from openhands.sdk.marketplace instead.",
8585
stacklevel=3,
8686
)

openhands-sdk/openhands/sdk/plugin/types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ def __getattr__(name: str) -> Any:
389389
warn_deprecated(
390390
f"Importing {name} from openhands.sdk.plugin.types",
391391
deprecated_in="1.16.0",
392-
removed_in="1.19.0",
392+
removed_in="1.21.0",
393393
details="Import from openhands.sdk.marketplace instead.",
394394
stacklevel=3,
395395
)

openhands-sdk/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "openhands-sdk"
3-
version = "1.18.1"
3+
version = "1.19.0"
44
description = "OpenHands SDK - Core functionality for building AI agents"
55

66
requires-python = ">=3.12"

openhands-tools/openhands/tools/browser_use/logging_fix.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515

1616
warn_cleanup(
1717
"Monkey patching to prevent browser_use logging interference",
18-
cleanup_by="1.19.0",
18+
cleanup_by="1.21.0",
1919
details=(
2020
"This workaround should be removed once browser_use fixes the "
2121
"problematic logging configuration code. The upstream PR #3717 "
2222
"(https://github.com/browser-use/browser-use/pull/3717) was closed "
23-
"without merge. As of browser_use 0.11.9 the module-level "
24-
"basicConfig(force=True) and _ensure_all_loggers_use_stderr() "
25-
"are still present. Re-evaluate on each release."
23+
"without merge. As of browser_use 0.11.9, the server still calls "
24+
"_ensure_all_loggers_use_stderr() during import and initialization. "
25+
"Re-evaluate when browser_use changes that behavior."
2626
),
2727
)
2828

openhands-tools/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "openhands-tools"
3-
version = "1.18.1"
3+
version = "1.19.0"
44
description = "OpenHands Tools - Runtime tools for AI agents"
55

66
requires-python = ">=3.12"

0 commit comments

Comments
 (0)