Skip to content

Releases: OpenHands/software-agent-sdk

v1.1.0 Release

11 Nov 19:02

Choose a tag to compare

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

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 choices by @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_policy argument; 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

Full Changelog: 1.0.0...v1.1.0

v1.0.0 Release

06 Nov 17:07
a612c0a

Choose a tag to compare

Official V1 SDK Release 🎉

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_id to 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.yml and 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's agent_status -> executiong_status by @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

Full Changelog: 1.0.0a5...1.0.0

1.0.0a5

29 Oct 16:19
e1fc206

Choose a tag to compare

1.0.0a5 Pre-release
Pre-release

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 FunctionCallValidationError handling & claude-haiku-4-5 to 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 examples script & 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_provider anti-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

Full Changelog: 1.0.0a3...1.0.0a5

1.0.0a3

20 Oct 15:50
b3fc175

Choose a tag to compare

1.0.0a3 Pre-release
Pre-release

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

17 Oct 21:48
06540a2

Choose a tag to compare

1.0.0a2 Pre-release
Pre-release

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-haiku by @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

14 Oct 17:11
ada376e

Choose a tag to compare

1.0.0a1 Pre-release
Pre-release

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 into conversation.py by @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 AgentContext by @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....
Read more