Releases: OpenHands/software-agent-sdk
Releases · OpenHands/software-agent-sdk
v1.1.0 Release
Highlights
- Added support for glm 4.6 and kimi-k2 (including extended thinking mode).
- Introduced TokenEvent for RL and a new ConversationErrorEvent.
- Improved visualization of CondensationRequest
- Telemetry improvements: automatic log directory creation
- Observability: ad support for OpenTelemetry via Laminar.
- FileEditor now supports reading image file.
What's Changed
Added
- Support glm 4.6 by @simonrosenberg in #1046
- Support
kimi-k2-thinkingby @ryanhoangt in #1093 - Add image file viewing support to FileEditor by @SmartManoj in #1016
- Support kimi-k2 extended thinking, fix prompt caching stats, fix max output by @xingyaoww in #1133
- examples: add observability example by @enyst in #1131
- add TokenEvent and TokenEvent processing for RL by @lintangsutawika in #1123
- visualizer: render CondensationRequest nicely by @enyst in #1113
- Auto-create log directory for telemetry by @SmartManoj in #1111
Fixes and Improvements
- Fix Datadog log-query to use Logs API instead of Error Tracking API by @neubig in #1043
- fix: recursively parse nested tools params by @Edward-sy in #1011
- refactor: git SHA-based Docker tags by default, versioned tags only on releases by @xingyaoww in #1088
- fix race during cleanup by @enyst in #1095
- Revert "Add FallbackRouter for LLM failover support" by @xingyaoww in #1105
- Fix Remote Runtime API Authentication by @xingyaoww in #1090
- We now have an explicit ConversationErrorEvent in the stream by @tofarr in #1106
- Remove default path from ENV_ROOT assignment by @SmartManoj in #1050
- Use shell:bash in run-examples workflow by @xingyaoww in #1057
- Allow override git ref/sha in docker build by configuring BuildConfig by @xingyaoww in #1100
- Fix: LLM telemetry logging by @enyst in #1028
- fix(condenser): When condensation is triggered by the unhandled_condensation_request condition, it will result in empty condensation. by @CLFutureX in #1034
- Enable Ruff checks for mutable defaults (B006, B008, B039, RUF012) by @enyst in #1055
- Handle nested field schema formatting for tool description by @ryanhoangt in #1001
- Fix resume reconciliation by treating litellm_extra_body as runtime override by @enyst in #1115
- tests(llm): add explicit retry behavior tests for empty
choicesby @enyst in #1107 - SDK: export ConversationExecutionStatus via public API by @enyst in #1126
- fix(backend): unable to create a new conversation using the planning agent’s tools. by @hieptl in #1125
- Simplify API Workspace example with
image_pull_policyargument; fix erroneous clean up of client by @xingyaoww in #1127 - refactor: move TokenEvent from llm_convertible to event by @xingyaoww in #1130
- Fix success rate calculation to exclude skipped tests by @xingyaoww in #1136
- Refactor: Always include risk fields by @malhotra5 in #1052
New Contributors
- @Edward-sy made their first contribution in #1011
- @lintangsutawika made their first contribution in #1123
Full Changelog: 1.0.0...v1.1.0
v1.0.0 Release
Official V1 SDK Release 🎉
- Documentation: https://docs.openhands.dev/
- Evaluation: https://docs.google.com/spreadsheets/d/1wOUdFCMyY6Nt0AIqF705KN4JKOWgeI4wUGUP60krXXs/edit?gid=811504672#gid=811504672
- Paper: https://arxiv.org/abs/2511.03690
What's Changed
- Agent Server UUIDs without hyphens by @tofarr in #960
- Enhance README with branding and resources by @xingyaoww in #961
- Default to function calling enabled, remove FUNCTION_CALLING_PATTERNS allowlist by @xingyaoww in #956
- Rename SecretsManager to SecretRegistry by @enyst in #965
- Rename ConversationState field to secret_registry with read-alias by @enyst in #969
- Add codex-mini-latest to RESPONSES_API_PATTERNS by @YakshithK in #934
- Fix double dollar sign in visualizer metrics display by @xingyaoww in #938
- fix browser tool cleanup by @dinmukhamedm in #942
- feat: Add
llm_response_idto all LLM generated events by @ApGa in #930 - Fix formatting: remove extra blank line in model_features.py by @xingyaoww in #973
- Fix VNC security vulnerability by defaulting to disabled by @rbren in #974
- Fix wrong server path for file upload endpoint by @ryanhoangt in #951
- Fix bash executor session reuse by resetting closed sessions by @softpudding in #964
- Fix duplicate reviewer assignment in assign-reviews workflow by @neubig in #827
- Add logging for file upload and download actions by @rbren in #993
- sdk(llm): Stop model-name whack-a-mole: revert to core family substring matching by @enyst in #879
- Add glm4.6 to FORCE_STRING_SERIALIZER by @simonrosenberg in #994
- update patterns in FORCE_STRING_SERIALIZER_PATTERNS by @simonrosenberg in #995
- Add tests for string serializer by @enyst in #996
- Add cost reporting for
run-examples.ymland schedule scripts to run daily by @ryanhoangt in #977 - Remove default MCP servers from preset agents by @xingyaoww in #984
- Bug: fix Visualizer "Message To User" that should be "Message from User" by @simonrosenberg in #1002
- Tweak review workflow for draft PRs by @enyst in #997
- Fix(llm):When LLM calls are retried, it can lead to inaccurate records. by @CLFutureX in #949
- Normalize SDK errors for clients by @enyst in #980
- Add Datadog debugging example with API integration tools by @neubig in #272
- Add Sphinx-compatible docstrings to core SDK classes by @rbren in #1006
- Refactor ToolDefinition architecture to use subclass pattern for all tools by @xingyaoww in #971
- Fix datadog debugging workflow example by @neubig in #1009
- feat(backend): enhance search_conversation_events functions with timestamp filtering support by @hieptl in #695
- Add comprehensive unit tests for conversation_router.py endpoints by @tofarr in #1010
- Update example API key in README by @SmartManoj in #1013
- Migrate to Blacksmith official Docker actions with native multi-platform builds by @xingyaoww in #990
- Fix/remove docstring for OpenHands tool package by @rbren in #1018
- feat(llm): forward extra_headers to LiteLLM completion and responses by @enyst in #733
- refactor: rename
AgentExecutionStatus->ConversationExecutionStatus& state'sagent_status->executiong_statusby @simonrosenberg in #839 - Add OpenTelemetry with Laminar SDK by @dinmukhamedm in #681
- More agent_status to execution_status_updates, and error state by @tofarr in #1019
- Recognize GPT‑5 context overflow and trigger condenser (Fixes #776) by @enyst in #783
- Rename metadata field to litellm_extra_body and add custom config support by @li-boxuan in #837
- Fix error in 422 logs due to blank bearer token by @tofarr in #1022
- Fix abbreviation formatting in visualizer by @SmartManoj in #989
- Implement automatic tool registration on import by @malhotra5 in #862
- feat: Add automatic loading of user skills from home directory by @whywaita in #950
- Fix multi-arch manifest merge to use correct tag names by @xingyaoww in #1024
- Disable Copilot chat command center icon by default (parity with OpenHands PR #11589) by @enyst in #1032
- Fix Docker cache tag length exceeding 128 character limit by @xingyaoww in #1029
- Fix Laminar span stack warning in LocalConversation by @jpshackelford in #1039
- Include 03_browser_use_with_docker_sandboxed_server.py in test-examples workflow by @xingyaoww in #1021
- A couple of fixes for OpenAI o3 by @enyst in #1031
- refactor: standardize Observation base class by @simonrosenberg in #929
- Fix: Make reasoning_effort optional by @Chesars in #1004
- Simplify hello world example by @rbren in #1047
- Add reviewer trigger for PR review workflow by @simonrosenberg in #1037
- Fix RemoteConversation stats field mismatch and state updates by @xingyaoww in #1042
- Rename execute_bash to terminal & rename BashTool to TerminalTool by @SmartManoj in #1033
- Improve visualization API: allow passing ConversationVisualizer directly by @xingyaoww in #1025
- v1.0.0 release by @xingyaoww in #1056
New Contributors
- @YakshithK made their first contribution in #934
- @ApGa made their first contribution in #930
- @softpudding made their first contribution in #964
- @CLFutureX made their first contribution in #949
- @SmartManoj made their first contribution in #1013
- @whywaita made their first contribution in #950
- @Chesars made their first contribution in #1004
Full Changelog: 1.0.0a5...1.0.0
1.0.0a5
What's Changed
- Fix PR review workflow subdirectory paths by @simonrosenberg in #824
- Fix httpx.UnsupportedProtocol error by setting base_url on clients by @neubig in #801
- docs: set tags=["Server Details"] for
/path by @xingyaoww in #829 - Enforce batch atomicity for condenser by @ryanhoangt in #775
- Replace All-Hands-AI references with OpenHands by @rbren in #830
- Fix: Make adding security_analyzer optional for get_default_agent by @jimwhite in #802
- Add test to reproduce bug #825: execute_command includes previous output by @neubig in #828
- Add
FunctionCallValidationErrorhandling &claude-haiku-4-5to function calling supported models by @ryanhoangt in #832 - Set add_security_analyzer=False by default and simplify examples by @xingyaoww in #846
- Debug: glob tool fails when pattern contains path by @simonrosenberg in #718
- .github/workflows: Migrate workflows to Blacksmith runners by @blacksmith-sh[bot] in #831
- Rename "microagents" to "skills" throughout the repository by @neubig in #820
- Fix FastAPI path parameters to handle file paths with forward slashes by @amanape in #848
- Env template generator by @tofarr in #847
- Socket logging by @tofarr in #858
- Simplify examples for docs by @xingyaoww in #859
- fix: ReadTimeout when calling 01_convo_with_local_agent_server.py by @juanmichelini in #857
- Simplify remote agent server examples by @xingyaoww in #868
- Add conversation to tool calls by @simonrosenberg in #877
- Add workflow to check documented examples by @xingyaoww in #878
- chore(examples): env-driven endpoints, platform detection; update domains and API var names by @enyst in #872
- Fix DockerWorkspace execute_command timeout issue by @neubig in #871
- tests(remote): silence pytest collection warning by renaming helper class by @enyst in #880
- Fix agent status not transitioning to running status by @ryanhoangt in #884
- Dependency Injection for EventService by @tofarr in #885
- add asssign reviews workflow to examples by @simonrosenberg in #883
- feat(tests): Add comprehensive test suite for RemoteConversation implementation by @xingyaoww in #451
- Switch back to pyright + stricter typing to allow vscode to resolve imports by @xingyaoww in #869
- Fix pyright issues in agent status transition tests by @enyst in #895
- Fix MCP tool validation error by excluding 'kind' field from action data by @xingyaoww in #887
- Add regression test for bash command endpoint fix (#866) by @xingyaoww in #881
- Update sdk version to 1.0.0a4 by @xingyaoww in #901
- Fix PydanticSerializationUnexpectedValue warnings in log_completions by @xingyaoww in #904
- Fix #905: Handle None context_window for unmapped models by @xingyaoww in #906
- Add workflow to run
examplesscript & fix failed integration tests by @ryanhoangt in #914 - AsyncRemoteWorkspace now has working directory by @tofarr in #888
- refactor: move agent_final_response to utility function with proper type checking by @xingyaoww in #919
- Feat encrypted secrets by @tofarr in #893
- chore: remove Dependabot config (uv workspace unsupported) by @enyst in #897
- Bump the version-all group with 3 updates by @dependabot[bot] in #913
- Add docs workflow to repo.md and fix pyright type checking by @xingyaoww in #924
- feat: Implement blocking delegation by @simonrosenberg in #908
- refactor: Update ToolExecutor interface to use LocalConversation instead of BaseConversation by @xingyaoww in #925
- Fix #916: Suppress Pydantic serializer warnings from litellm by @xingyaoww in #917
- Update README to refer to documentation site by @xingyaoww in #928
- Feat git operations by @tofarr in #863
- refactor: Clean up
_configure_bash_tools_env_provideranti-pattern by @xingyaoww in #922 - Update integration test to use OpenHands proxy instead of litellm proxy by @simonrosenberg in #944
- feat: Post integration test results to tracker issue for daily runs by @simonrosenberg in #940
- Update litellm proxy path in workflows by @simonrosenberg in #946
- bump browser-use version, infer screenshot mime type dynamically by @dinmukhamedm in #935
- change base url in integration tests by @simonrosenberg in #947
- feat: support absolute paths for system_prompt_filename by @xingyaoww in #902
- Fix integration tests to work with fork PRs by @xingyaoww in #932
- refactor: fix naming inconsistency by @simonrosenberg in #958
- release version 1.0.0a5 by @xingyaoww in #959
New Contributors
- @jimwhite made their first contribution in #802
- @blacksmith-sh[bot] made their first contribution in #831
- @amanape made their first contribution in #848
- @dinmukhamedm made their first contribution in #935
Full Changelog: 1.0.0a3...1.0.0a5
1.0.0a3
What's Changed
- Add example for automated TODO management with GitHub Actions by @simonrosenberg in #758
- Rename LLM service identifiers to usage_id by @enyst in #799
- Bump the version-all group with 4 updates by @dependabot[bot] in #810
- Fix assign-reviews workflow subdirectory paths by @neubig in #807
- Fix websocket deprecation warning by using wsproto by @xingyaoww in #508
- Fix: Make Check OpenAPI Schema workflow work with fork PRs by @xingyaoww in #814
- Setting VSCode token to match SESSION_API_KEY. by @tofarr in #793
- Fix deprecated @model_validator usage in LLMSummarizingCondenser by @xingyaoww in #817
- Fix: Skip Docker build and push for fork PRs by @xingyaoww in #821
- 1.0.0a3 pre-release by @xingyaoww in #822
Full Changelog: 1.0.0a2...1.0.0a3
1.0.0a2
What's Changed
- Sync readme to changes by @enyst in #734
- use uv-managed python for "source" docker by @xingyaoww in #737
- Render user rejections in visualizer by @enyst in #746
- fix: make ThinkAction skip user confirmation like FinishAction by @malhotra5 in #742
- Add GitHub Actions workflow for scheduled maintenance tasks by @neubig in #672
- Enable unused variable detection in pre-commit hooks by @xingyaoww in #726
- Add optional conversation_id parameter to StartConversationRequest by @malhotra5 in #741
- Add AsyncRemoteWorkspace and sync with APIRemoteWorkspace by @tofarr in #735
- Update all SDK examples to read LLM_MODEL and LLM_BASE_URL from environment by @neubig in #740
- Add PR review workflow for fine-grained review comments by @simonrosenberg in #751
- Add "assign reviewers" workflow by @neubig in #756
- Update assign reviewers script based on experience by @neubig in #760
- Fix for URL endpoint location by @tofarr in #503
- Bump the version-all group with 2 updates by @dependabot[bot] in #535
- refactor: remove duplicated example and rename folder by @xingyaoww in #765
- Extend context truncation cases: broaden vLLM error detection by @enyst in #759
- Add support for
claude-4-5-haikuby @ryanhoangt in #768 - Fix PyPI Wheel by @xingyaoww in #752
- Print conversation ID when an exception stops the run (fixes #777) by @enyst in #779
- Feat: Add Configurable Plan Template to Planning Agent by @simonrosenberg in #778
- refactor(llm): extract kwargs normalization into pure options selectors by @enyst in #643
- Add basedpyright to pre-commit and fix all type errors by @xingyaoww in #593
- fix: deploy changes to docs repo by @xingyaoww in #786
- update deploy-to-docs workflow by @xingyaoww in #788
Full Changelog: 1.0.0a1...1.0.0a2
1.0.0a1
What's Changed
- Setup Makefile, Pre-commit, and initial Tool and Schema definition by @xingyaoww in #1
- Port over file editor tool by @xingyaoww in #2
- Fix tool schema and add relevant tests; Add bash implmentations by @xingyaoww in #4
- Update README and add repo.md by @xingyaoww in #5
- ci: add coverage report and summary to tests workflow (closes #3) by @xingyaoww in #6
- Port over BashSession and tests by @xingyaoww in #7
- Openhands/move coverage badge to docs assets by @xingyaoww in #10
- Update ci badge on pr only by @xingyaoww in #11
- Add minimal config & port over the LLM class by @xingyaoww in #12
- Only trigger tests on PR by @xingyaoww in #15
- Port over minimal set of agent, config, context, microagent; adjust existing tool definition by @xingyaoww in #18
- Improve tool call visualization by @xingyaoww in #20
- run test on main by @xingyaoww in #21
- logger: set LiteLLM loggers to WARNING by default; enable DEBUG with DEBUG_LLM confirmation by @xingyaoww in #23
- Remove json repair by @xingyaoww in #24
- Add ruff configuration for import sorting by @xingyaoww in #17
- Simplify pre-commit CI by @xingyaoww in #26
- rename package openhands-ai to openhands-sdk by @xingyaoww in #27
- Rename openhands-ai as openhands-sdk by @xingyaoww in #28
- Rename unnecessary test_ruff_config.py by @xingyaoww in #29
- Restructure agent-sdk repository into UV workspace with simplified structure by @xingyaoww in #33
- add openhands setup.sh by @xingyaoww in #31
- ci: make coverage PR comment sticky to avoid duplicates (fixes #34) by @xingyaoww in #35
- refactor repo by creating
context/; move looping logic intoconversation.pyby @xingyaoww in #36 - Update repo.md for tests by @xingyaoww in #37
- support multiple callback fn; improve examples of how to add callback from script by @xingyaoww in #38
- refactor FinishTool to builtin tools for agents by @xingyaoww in #39
- follow torvards-mode suggestion: integrate lock with state, and modify state in-place by @xingyaoww in #40
- Make unit test jobs conditional based on folder changes by @xingyaoww in #46
- refactor the system to use Event Types by @xingyaoww in #44
- Conversation: make state.events.append a default callback; remove manual appends in CodeActAgent by @xingyaoww in #57
- Remove prompt manager and instead using simpler jinja util function by @xingyaoww in #63
- Port over microagent changes in OpenHands/OpenHands#10528 by @xingyaoww in #65
- Add ruff format to pre-commit hooks for consistent code formatting by @xingyaoww in #67
- Fix: Include Jinja2 template files in package distribution by @malhotra5 in #69
- Reduce line-length from 500 to 88 and fix pre-commit errors by @xingyaoww in #68
- Add remaining LLM fixes and LLM registry by @ryanhoangt in #70
- Port LLM tests from OpenHands to agent-sdk by @enyst in #48
- Standardize project test structure by @xingyaoww in #75
- Standardize on absolute imports (PEP 8) and ensure repo package precedence by @xingyaoww in #74
- Rename CodeActAgent to Agent and update folder structure by @xingyaoww in #78
- Rename openhands.core to openhands.sdk by @xingyaoww in #73
- Core context condensation implementation by @csmith49 in #61
- test: Add comprehensive tests for events_to_messages conversions by @xingyaoww in #81
- Support microagents and unify it within
AgentContextby @xingyaoww in #71 - feat: Add BashTool and FileEditorTool subclasses for simplified tool initialization by @xingyaoww in #88
- Fix coverage upload issue in CI workflow by @xingyaoww in #90
- Optimize pre-commit speed by setting always_run to false by @xingyaoww in #96
- fix typo in prompt suffix by @xingyaoww in #97
- Configure Dependabot for uv and GitHub Actions by @xingyaoww in #98
- fix: Minor test cleanup by @csmith49 in #99
- Bump astral-sh/setup-uv from 3 to 6 by @dependabot[bot] in #100
- Add open-pull-requests-limit and groups to dependabot by @xingyaoww in #105
- Bump the version-all group with 4 updates by @dependabot[bot] in #108
- Bump actions/checkout from 4 to 5 by @dependabot[bot] in #104
- Port config tests from OpenHands to agent-sdk by @enyst in #49
- fix: Idempotent Message serialization by @csmith49 in #106
- Bump actions/download-artifact from 4 to 5 by @dependabot[bot] in #101
- Implement confirmation mode for OpenHands agent SDK by @malhotra5 in #80
- feat(agent): simplify security guidelines in system prompt by @enyst in #115
- Update system prompt SECURITY section to match OpenHands PR #10822 by @xingyaoww in #114
- feat: improve visualizer by @xingyaoww in #119
- Migrate CLI subprocess shell and refactor BashSession architecture by @xingyaoww in #109
- Refactor LLMConfig into LLM pydantic class & large refactor of LLM class logic by @xingyaoww in #91
- Clean up all examples; add interactive bash example; improve visualizer for action by @xingyaoww in #122
- Update README.md and fix an AgentContext bug by @xingyaoww in #127
- Port runtime bash tests by @ryanhoangt in #84
- Migrate MCP clients by @ryanhoangt in #94
- feat(logger): improve logger using RichHandler by @xingyaoww in #132
- Fix confusing LLMRegistry API after LLM/LLMConfig merge by @xingyaoww in #129
- Add pause/resume functionality to agent-sdk conversation system by @malhotra5 in #118
- Add truncation to ExecuteBashObservation and TextContent with warning checks by @xingyaoww in #124
- docs: Add comprehensive tools system documentation by @xingyaoww in #136
- Move tests to a new directory by @xingyaoww in #140
- Fix pause event type by @malhotra5 in #144
- chore(docs): create docs/ folder and move existing documentation by @enyst in #117
- fix: resolve empty API keys to None and add Bedrock model support by @enyst in #141
- Fix prompt caching and improve input/output metrics visualization by @xingyaoww in #143
- Stabilize tests: telemetry logging warning and Bash PS2 prompt capture by @enyst in #145
- Fix issue #10729: Add xai/grok-code-fast-1 to MODELS_WITHOUT_STOP_WORDS by @enyst in #147
- Update microagent prompt to be more collaborative and less abrasive by @xingyaoww in #149
- feat: Lazy discriminated unions for event/action/observation serialization by @csmith49 in https://github....