Conversation
Add key-value tag metadata to conversations. Tags can be specified when creating or updating a conversation via the SDK or REST API. Validation rules: - Keys must be lowercase alphanumeric (regex: ^[a-z0-9]+$) - Values are arbitrary strings, max 256 characters Changes: - Add ConversationTags validated type in conversation/types.py - Add tags field to ConversationState (persisted in base_state.json) - Add tags parameter to Conversation factory, LocalConversation, and RemoteConversation - Add tags to StartConversationRequest and UpdateConversationRequest (PATCH can now update tags, title, or both) - Flow tags through conversation_service start and update paths - Export ConversationTags from conversation package Co-authored-by: openhands <openhands@all-hands.dev>
Contributor
Python API breakage checks — ✅ PASSEDResult: ✅ PASSED |
Contributor
REST API breakage checks (OpenAPI) — ❌ FAILEDResult: ❌ FAILED
Log excerpt (first 1000 characters) |
Contributor
Coverage Report •
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
Contributor
Author
|
@OpenHands check github actions and fix the failing tests |
|
I'm on it! rbren can track my progress at all-hands.dev |
all-hands-bot
approved these changes
Mar 15, 2026
Collaborator
all-hands-bot
left a comment
There was a problem hiding this comment.
🟢 Good taste - Clean implementation. The dict[str, str] with Pydantic BeforeValidator is exactly the right pattern here. Validation is straightforward, backward compatible, and well-tested. LGTM! 👍
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add key-value tag metadata to conversations. Tags can be specified when creating or updating a conversation via the SDK or REST API.
Validation rules
^[a-z0-9]+$)Changes
SDK layer (
openhands-sdk/)ConversationTagstype inconversation/types.py— Pydantic-validateddict[str, str]with aBeforeValidatorenforcing key/value constraintsConversationState— new persistedtagsfield (auto-saved tobase_state.json)Conversationfactory —tagsparameter on all overloadsLocalConversation— acceptstags, flows toConversationState.createRemoteConversation— acceptstags, includes in server POST payloadConversationTagsexported from conversation packageServer API layer (
openhands-agent-server/)StartConversationRequest—tags: ConversationTagsfield (defaults to{})UpdateConversationRequest—tags: ConversationTags | Nonefield (PATCHcan now update tags only, title only, or both;titlemade optional)StoredConversation/ConversationInfo— inherit tags from parentsconversation_service.update_conversation— handles tag updates, syncs toConversationStateTests (18 new, all passing)
tests/sdk/conversation/test_tags.py— validation unit tests (valid keys, invalid keys, value length limits, Pydantic model integration)tests/agent_server/test_conversation_tags.py— API endpoint tests (create with/without tags, invalid keys rejected with 422, PATCH tags, GET returns tags)Agent Server images for this PR
• GHCR package: https://github.com/OpenHands/agent-sdk/pkgs/container/agent-server
Variants & Base Images
eclipse-temurin:17-jdknikolaik/python-nodejs:python3.13-nodejs22golang:1.21-bookwormPull (multi-arch manifest)
# Each variant is a multi-arch manifest supporting both amd64 and arm64 docker pull ghcr.io/openhands/agent-server:6606e54-pythonRun
All tags pushed for this build
About Multi-Architecture Support
6606e54-python) is a multi-arch manifest supporting both amd64 and arm646606e54-python-amd64) are also available if needed