Skip to content

1.0.0a1

Pre-release
Pre-release

Choose a tag to compare

@xingyaoww xingyaoww released this 14 Oct 17:11
· 2092 commits to main since this release
ada376e

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 #133
  • Support microagent repo.md with new MCP tool format by @xingyaoww in #154
  • Add conversation ID to Conversation class by @xingyaoww in #158
  • fix(MCP): do not include base action attributes like kind safety_risk for executing MCP Action by @xingyaoww in #156
  • fix parent fields to include kind by considering model_fields_computed by @xingyaoww in #159
  • increase mcp timeout to 300 sec by @xingyaoww in #160
  • Fix switching confirmation mode and approving actions in one step by @malhotra5 in #163
  • feat: Support reasoning content in Agent SDK by @enyst in #139
  • Add think and task_tracker tools by @ryanhoangt in #148
  • Add comprehensive tests for file editor by @ryanhoangt in #165
  • chore: Merge test_editor_comprehensive with test_basic_operations by @xingyaoww in #168
  • Add docs for MCP and update README by @ryanhoangt in #166
  • Make Agent & Tool class a BaseModel with frozen=True by @enyst in #134
  • Refactor visualizer to use modular approach with individual event classes & consistent color by @xingyaoww in #171
  • Add visualize_diff functionality to StrReplaceEditorObservation by @malhotra5 in #125
  • refactor test folder - rename integration -> cross by @simonrosenberg in #178
  • Make both agent and tool subclass of DiscriminatedUnionMixin & serializable by @xingyaoww in #174
  • Flatten agent folder since there's only one agent now by @xingyaoww in #179
  • refactor(llm): extract non-native tool-calling into mixin by @enyst in #182
  • Update stale documentation for OpenHands Tools System by @xingyaoww in #184
  • Improve visualization of Agent SDK by @xingyaoww in #187
  • Serialization of Conversation to FileStore by @xingyaoww in #41
  • Add test for using LLM for non-function call completions by @xingyaoww in #185
  • Move prompts in context directory by @enyst in #191
  • Restructure documentation into comprehensive architecture/ folder and add OH doc update workflow by @xingyaoww in #188
  • docs: tweak header by @xingyaoww in #196
  • docs: Add context architecture documentation and improve mermaid chart readability by @xingyaoww in #197
  • Update documentation to reflect current codebase structure by @xingyaoww in #198
  • refactor: rename/remove 'integration' from cross tests by @simonrosenberg in #202
  • refactor: remove emoji from security risk policy by @simonrosenberg in #201
  • feat: add file deletion step in examples by @simonrosenberg in #200
  • fix: ImportError during Python shutdown in terminal session cleanup by @xingyaoww in #162
  • feat(viz): do not show finish action observation; increase margin for all by @xingyaoww in #204
  • feat: support for setting conversation id when start the conversation by @xingyaoww in #203
  • move docs from this repo to docs repo and disable sync by @xingyaoww in #207
  • feat: visualize notes in italic for task tracker by @xingyaoww in #210
  • Use file-backed list for "events" by @xingyaoww in #205
  • Add AsyncConversationCallback type and AsyncCallbackWrapper class by @tofarr in #217
  • chore: remove redundant RetryMixin in llm.py by @xingyaoww in #222
  • fix microagent typing that breaks openapi.json & remove unused by @xingyaoww in #221
  • Fix README accuracy issues by @enyst in #225
  • Fix type hints for get_edit_groups to accept optional parameters by @enyst in #229
  • Fix FileStore ABC inheritance by @enyst in #227
  • Remove redundant agent diff check logic by @enyst in #231
  • Fix LocalFileStore.list() to handle file targets gracefully by @enyst in #228
  • Expand conversation abbreviations to full names by @enyst in #233
  • fix: prevent data mutation during visualize by @enyst in #226
  • do not try to force ImageContent be subclass of mcp image content by @xingyaoww in #212
  • Replace list[TextContent | ImageContent] with Sequence[...] for type compatibility by @xingyaoww in #238
  • Improve error handling in TaskTracker JSON loading by @enyst in #230
  • Make all events immutable by adding frozen=True by @xingyaoww in #241
  • feat: Add secrets manager for secure credential handling by @malhotra5 in #189
  • Remove all dim text styling from visualizer by @xingyaoww in #244
  • Feat: mask secrets by @malhotra5 in #248
  • Fix execute_bash tool to inherit environment variables from parent process by @xingyaoww in #245
  • fix: prevent path traversal attacks in LocalFileStore by @enyst in #232
  • Add repomix tool for codebase packaging and analysis by @xingyaoww in #247
  • Implement dynamic workspace path detection for str_replace_editor tool by @li-boxuan in #252
  • add support to customize system prompt via kwargs by @xingyaoww in #257
  • Bump tj-actions/changed-files from 46 to 47 in the version-all group by @dependabot[bot] in #259
  • feat: add integration tests and cron job workflow by @simonrosenberg in #219
  • Consolidate Agent State Management from Multiple Booleans to Single Enum by @xingyaoww in #261
  • add LLMConvertibleEventWithMetrics and add get_llm_metrics example by @xingyaoww in #262
  • Support for discriminated unions to dump and re-create from spec by @xingyaoww in #237
  • port over sdk change related to server implementation by @xingyaoww in #269
  • Model features: broaden patterns (o1*/o3*/gpt-5*) and small cleanups by @enyst in #273
  • fix .model_dump_json issue introduced in #237 by @xingyaoww in #277
  • Revert #262 LLMConvertibleEventWithMetrics to use a new type EventWithMetrics by @xingyaoww in #275
  • Add LLM JSON storage functionality by @malhotra5 in #278
  • LLM-summarizing condenser implementation by @csmith49 in #181
  • Expose methods/dicts for model choices by @malhotra5 in #276
  • Lift ID types in event to type aliases by @csmith49 in #279
  • Fix pause logic with new agent status enums by @malhotra5 in #280
  • Enforce list of Message only for LLM by @ryanhoangt in #260
  • fix FastAPI serialization with SkipJsonSchema by @xingyaoww in #283
  • refactor: rename test for consistency by @simonrosenberg in #289
  • Add t02_add_bash_hello.py integration test by @simonrosenberg in #291
  • Add t07_interactive_commands.py integration test by @simonrosenberg in #297
  • Fix integration job when run on schedule by @simonrosenberg in #299
  • Add t03_jupyter_write_file.py integration test by @simonrosenberg in #292
  • Add t04_git_staging.py integration test by @simonrosenberg in #293
  • Replace ConversationID to use uuid.UUID instead of string by @xingyaoww in #286
  • Integrate browser-use tools by @ryanhoangt in #214
  • Add t06_github_pr_browsing.py integration test by @simonrosenberg in #295
  • Add t05_simple_browsing.py integration test by @simonrosenberg in #294
  • Introduce Spec for simpler "API start" in server by @xingyaoww in #284
  • stop inherit TextContent from mcp.types.TextContent since it breaks JSON schema by @xingyaoww in #306
  • Remove CondenserSpec and use Condenser directly in AgentSpec by @xingyaoww in #308
  • Add LLM costs to integration tests by @simonrosenberg in #304
  • Ported over agent server code by @tofarr in #317
  • Add comprehensive documentation and improve configuration for OpenHands Agent Server by @tofarr in #318
  • Add pre-commit for YAML files by @xingyaoww in #321
  • Build agent-server into executable binary by @xingyaoww in #320
  • Add MIT License to the project by @xingyaoww in #325
  • refactor: remove run_infer.sh for integration tests by @simonrosenberg in #324
  • Build docker for Agent SDK by @xingyaoww in #326
  • Comment on PR when docker build finishes by @xingyaoww in #329
  • Create lazy import statements in tools package by @malhotra5 in #330
  • refactor: update logs by @simonrosenberg in #332
  • Bump the version-all group with 3 updates by @dependabot[bot] in #322
  • Security analyzer framework by @csmith49 in #305
  • set base_url directly instead of set default for oh provider by @xingyaoww in #338
  • remove DynamicStrReplaceEditor action by removing the hardcoded path in tool desc by @xingyaoww in #340
  • Do not add security_risk unless security analyzer is enabled by @xingyaoww in #341
  • make _add_security_risk_prediction a property for re-use by @xingyaoww in #347
  • tool: default editor cwd to current cwd by @xingyaoww in #349
  • Add Docker image variants for Java, Golang by @rbren in #345
  • Support pass str to send_message in Conversation class by @rbren in #339
  • Simpler serialization! by @tofarr in #331
  • Fix CI: Only run build-and-push-image on main or build-docker tag by @xingyaoww in #361
  • Create MCPToolAction with dynamic schema by @xingyaoww in #342
  • add a simple conversation viewer for debugging purpose by @xingyaoww in #363
  • Add gte constraints to Pydantic numeric fields by @tofarr in #367
  • Fix for serialization by @tofarr in #364
  • Use Blacksmith runners for all GitHub Actions workflows by @xingyaoww in #370
  • Bump the version-all group across 1 directory with 5 updates by @dependabot[bot] in #359
  • feat: add expose_secrets context parameter for AgentSpec serialization by @malhotra5 in #368
  • More serialization fix by @xingyaoww in #374
  • docs(spec): fix AgentSpec examples in comments and align README with examples by @enyst in #380
  • docs: sync README with examples and presets by @enyst in #381
  • Relax openapi schema test & make Microagent a DiscriminatedUnionMixin and tests by @xingyaoww in #377
  • Unify tool initialization — Step 1: global registry + lazy materialization by @xingyaoww in #356
  • Update README.md to match current codebase structure and API by @xingyaoww in #384
  • docs(repo): add section 'Avoid overly defensive code' to repo.md by @enyst in #385
  • chore(typing): adopt Python 3.12 style (PEP 585/604) by @enyst in #382
  • refactor: centralize tool conversion in LLM (split from #142) by @enyst in #371
  • chore(visualization): remove dim everywhere, fix diff newline by @xingyaoww in #389
  • Add example showing agent can handle messages sent while task is running by @simonrosenberg in #378
  • Move tests importing openhands.tools from tests/sdk to tests/cross by @xingyaoww in #390
  • Replaces confirmation mode with confirmation policy by @csmith49 in #348
  • server: register default tools on server & add /tool/list endpoint for registry by @xingyaoww in #392
  • Server details by @tofarr in #362
  • Fix server hang due to browser-use & more loggings for server by @xingyaoww in #399
  • Add LLM router by @ryanhoangt in #152
  • Disable auth for /server_info endpoint by @rbren in #405
  • Fix: Reverse --reload flag logic to default to False by @rbren in #406
  • Add sudo to base package installation in Dockerfile by @rbren in #409
  • Add optional static files directory support to agent server by @tofarr in #395
  • Change default base image to slim version by @rbren in #404
  • Add VSCode and Docker to agent-server Dockerfile by @rbren in #412
  • Build Docker images for Python on all commits by @rbren in #413
  • Remove custom model_dump_with_secrets method and use Pydantic context-based serialization by @malhotra5 in #423
  • chore: remove --no-reload that was removed by @xingyaoww in #424
  • chore(log): flip logger.info to logger.debug for LLM by @xingyaoww in #425
  • Consolidate security content into centralized security policy by @neubig in #422
  • Port over stuck detector by @ryanhoangt in #335
  • Prefix api routes with /api by @tofarr in #428
  • Fix persistence path in default agent by @malhotra5 in #429
  • chore(log): make condenser log debug by @xingyaoww in #430
  • Handle context window exceeded exceptions with registered condenser by @csmith49 in #358
  • fix condensation issue caused by condenser view by @xingyaoww in #432
  • Expand webhook protocol to support conversation lifecycle events by @tofarr in #379
  • Bump actions/setup-node from 4 to 5 in the version-all group by @dependabot[bot] in #401
  • refactor: create ObservationBaseEvent and refactor llm_convertible events to multiple files by @xingyaoww in #433
  • chore: simplify examples/04_confirmation_mode_example.py by @xingyaoww in #436
  • Fix security analyzer by @xingyaoww in #435
  • refactor(conversation): initial protocol for conversation by @xingyaoww in #431
  • Fix exception handling for unauthorized requests by @rbren in #408
  • Documentation updates by @tofarr in #434
  • Fix websocket infinite loop on user disconnect by @tofarr in #439
  • Solve final action concurrent message bug by @simonrosenberg in #403
  • Authentication Upgrades by @tofarr in #438
  • Add stale issue and PR management workflow by @xingyaoww in #445
  • Added file upload download routes and reorganized endpoints using tags by @tofarr in #448
  • feat(sdk): Implement LocalConversation and RemoteConversation (fixes #388) by @xingyaoww in #391
  • Port over conversation stats by @malhotra5 in #288
  • Expose property for when confirmation policy is set by @malhotra5 in #449
  • Add LLMSecurityAnalyzer as default security analyzer in get_default_agent by @malhotra5 in #454
  • Docker Sandboxed Remote Conversation by @xingyaoww in #455
  • Add Example Application by @tofarr in #393
  • Fix concurrent user messages sent while agent is finishing by @simonrosenberg in #443
  • chore(ruff): enforce Python 3.12 typing standards with UP006, UP007, … by @simonrosenberg in #464
  • Removed conversation_id from event api by @tofarr in #457
  • Removed reference to old name by @tofarr in #466
  • Another rename by @tofarr in #467
  • Add pyupgrade rules to Ruff config by @xingyaoww in #465
  • fix sonnet 4 output size by @xingyaoww in #468
  • Add Chromium binary check and auto-install if not available by @ryanhoangt in #440
  • Feat: add cron job for typing quality check by @simonrosenberg in #462
  • Fix typing issues: remove vague unions, optional runtime fields, and consumer-side narrowing by @simonrosenberg in #461
  • Add comprehensive tests for browser-use tools by @ryanhoangt in #441
  • Fix: makes sure conversation stats is passed to conversation visualizer by @malhotra5 in #478
  • Tighten typing to remove vague unions and optional runtime fields by @simonrosenberg in #473
  • Fix #470: Update PR description instead of creating comments for agent server images by @xingyaoww in #472
  • Improve server logging for HTTP 500 by @xingyaoww in #480
  • feat: Add BashTaskService for executing bash commands outside agent context by @tofarr in #453
  • Refactor LLM registry to remove service_id parameter from add() method by @malhotra5 in #482
  • Move WebSocket endpoints to /sockets and use query parameter authentication by @tofarr in #486
  • Fix quoted 'Self' type annotations by @simonrosenberg in #488
  • Add reset functionality to BashExecutor for unresponsive terminals by @xingyaoww in #474
  • Fix server.yml PR description to account for all Docker variants by @xingyaoww in #483
  • Add @AbstractMethod decorators to base classes by @simonrosenberg in #490
  • Remove pandas from dev dependencies by @xingyaoww in #496
  • Public APIs return OpenHands types not LiteLLM types - Part 1: CompletionResult by @jpshackelford in #375
  • feat: Add Web VSCode support to AgentServer by @xingyaoww in #477
  • Fix LLM service_id naming inconsistencies in examples by @malhotra5 in #499
  • Update dockerfile with browser-use deps by @ryanhoangt in #502
  • fix remote conversation by update socket url; add browsing example by @xingyaoww in #505
  • Serve server info from / rather than 404 if no static files by @tofarr in #512
  • Fix sandbox build script lookup to work from any directory by @juanmichelini in #513
  • Fix PyInstaller binary build: include all Jinja2 template files by @xingyaoww in #514
  • Add API key support to RemoteConversation by @rbren in #523
  • Remove load_from_toml function and tomli dependency by @xingyaoww in #526
  • Fix sonnet3.5 recognition by @enyst in #524
  • feat: Add generic environment variable configuration parsing for Pydantic models by @tofarr in #511
  • Include conversation_id parameter in WebhookSubscriber by @tofarr in #528
  • Refactor: Move presets to tools package and integrate LLM metadata by @xingyaoww in #532
  • Refactor: Fix agent to continue conversation when tool doesn't exist by @simonrosenberg in #546
  • Refactor: move get_unmatched_actions to ConversationState as static method by @simonrosenberg in #540
  • refactor: remove llm context manager by @simonrosenberg in #537
  • Support VNC inside agent-server - and allows for interactive browsing!! by @xingyaoww in #515
  • Refactor: remove pass statements from abstract methods and add meaningful docstrings by @simonrosenberg in #542
  • add claude-sonnet-4.5 by @xingyaoww in #558
  • Fix remaining claude-4-5 issues by @xingyaoww in #560
  • Bump the version-all group with 3 updates by @dependabot[bot] in #536
  • Support Two Types of Directories for Conversations: persistence_dir and working_dir by @xingyaoww in #531
  • Refactor: deduplicate compose_callbacks by @simonrosenberg in #568
  • Replace ListLike Protocol with list[T] type annotations by @simonrosenberg in #562
  • Implement Workspace and support system-level bash execution by @xingyaoww in #534
  • Fix FIFOLock + pytest collection warnings by renaming test helper classes by @simonrosenberg in #572
  • Add ConversationState updates to websocket events by @xingyaoww in #556
  • fix(sdk): prevent CLI crash by early-validating MCP tool args (closes OpenHands/OpenHands#11163) by @neubig in #529
  • fix: changed suffix in agent server naming from timestamp from random uuid by @juanmichelini in #577
  • Fix FIFOLock test race condition and pytest warnings by @simonrosenberg in #575
  • Have post to /conversations work without redirect by @tofarr in #578
  • Creating a workspace object should not try to create the dir by @tofarr in #579
  • auto-create working dir if it doesn't exists for LocalConversation by @xingyaoww in #582
  • add py.typed for all modules by @xingyaoww in #584
  • Pillow now seems to be required in the agent server by @tofarr in #580
  • add Agent to ConversationStateProtocol by @xingyaoww in #586
  • DockerFile. now detects correct chromium name for Ubuntu and Debian by @juanmichelini in #588
  • Add Anthropic thinking blocks support to events system by @xingyaoww in #576
  • feat: env path to docker building files not in packages by @juanmichelini in #587
  • Fix multiple inheritance issue in ConversationState (#583) by @xingyaoww in #585
  • Fix nested LLM reconciliation in agent deserialization by @malhotra5 in #517
  • Enable interleaved thinking by @xingyaoww in #594
  • Fix sonnet 4.5 output token by @xingyaoww in #595
  • Refactor OpenHands SDK: Optional service_id, rename base classes, and enhance Conversation by @rbren in #591
  • Rename Tool class to ToolDefinition across entire codebase by @rbren in #592
  • Remove Tool = ToolDefinition alias and Tool exports by @xingyaoww in #602
  • Add ZIP download for conversation visualizer and fix directory reset issue by @xingyaoww in #601
  • Rename ToolSpec to Tool throughout the repository by @rbren in #599
  • Remove deprecated params={'working_dir'} and params={'workspace_root'} patterns from tools by @xingyaoww in #604
  • Fix MCP tool security risk prediction schema bug by @xingyaoww in #607
  • Fix StrReplaceEditor to include working directory in tool description by @simonrosenberg in #605
  • Add tests for Conversation constructor with secrets parameter by @rbren in #597
  • Better implementation of get_event by @tofarr in #610
  • Add resend_all parameter to events_socket endpoint by @tofarr in #608
  • Fix thinking budget 200k raising error with interleaved thinking by @ryanhoangt in #614
  • Add Pydantic models for workspace method return values by @tofarr in #615
  • feat: Add DockerWorkspace by @xingyaoww in #510
  • fix event service duplicate id by @xingyaoww in #617
  • Formal secrets by @tofarr in #616
  • Refactor: add MessageToolCall class instead of litellm's ChatCompletionMessageToolCall by @simonrosenberg in #550
  • Add full agent/LLM logs to integration test artifacts by @simonrosenberg in #612
  • Can now specify secrets on conversation start, and simplified type hints by @tofarr in #625
  • Refactor: rename str_replace_editor -> file_editor by @simonrosenberg in #628
  • Allow FileEditor insert_line to be 0 (start-of-file) by @enyst in #635
  • feat: NonExecutableActionEvent for Completions path (preserve tool_call_id continuity) by @enyst in #623
  • Add native responses by @enyst in #622
  • LLM → Telemetry: fixes by @enyst in #638
  • Remove deprecated to_llm_dict() and from_litellm_message() methods by @xingyaoww in #642
  • Bump the version-all group with 2 updates by @dependabot[bot] in #645
  • Fix: Remove 'kind' field from MCP schema output by @xingyaoww in #641
  • Implement generate_title method for Conversation class by @xingyaoww in #256
  • Revise README for OpenHands Agent SDK by @neubig in #649
  • Encapsulate conversation title generation via EventService by @enyst in #653
  • Remove automatic Chromium installation from browser tool by @rbren in #652
  • Replace LITELLM_API_KEY with LLM_API_KEY in examples by @neubig in #654
  • Support GPT-5-Codex by @xingyaoww in #655
  • Fix browser use tools not init error by @ryanhoangt in #658
  • refactor: move DockerWorkspace to separate openhands/workspace package by @rbren in #666
  • Feat: make read-only planning agent by @simonrosenberg in #624
  • Investigate Integration Tests Failures by @simonrosenberg in #651
  • fix: prevent tests from making HTTP calls to production LLM proxy by @neubig in #673
  • Refactor: integration tests by @simonrosenberg in #677
  • fix(backend): [agent server] remote workspace loading all bash events instead of using filters by @hieptl in #679
  • Allow security_analyzer to differ during agent reconciliation by @xingyaoww in #669
  • fix: Path(file) points to workspace.py not docker.py by @juanmichelini in #683
  • Add is_confirmation_mode_active property to BaseConversation by @malhotra5 in #687
  • Fix for small logic hole in env parser by @tofarr in #688
  • Remote Runtime API (no build) by @xingyaoww in #684
  • feat(backend): [Agent Server] Implement update_conversation API by @hieptl in #661
  • Refactor Docker build system: Replace variant with custom_tags and prioritize SHA-based tags by @xingyaoww in #685
  • Support building "minimal" version of agent-server docker image by @xingyaoww in #693
  • Bug fix gpt 5 responses api bis by @simonrosenberg in #699
  • fix color in makefile by @xingyaoww in #705
  • fix coverage report comment by making it shorter by @raymyers in #701
  • Reorganize examples by @xingyaoww in #696
  • remote convo: log request error by @xingyaoww in #709
  • Python-based Docker Build Script by @xingyaoww in #698
  • Fix ConversationService lifecycle management to prevent inactive_service errors by @tofarr in #715
  • Add configurable VSCode port parameter by @tofarr in #717
  • Bump astral-sh/setup-uv from 6 to 7 in the version-all group by @dependabot[bot] in #721
  • Update planning system prompt by @simonrosenberg in #719
  • Update scripts to fix websocket by @tofarr in #716
  • Remove AGENT_SDK_PATH environment variable by @juanmichelini in #724
  • Add Vscode initial settings extension by @enyst in #720
  • Runtime errors with security risk and no configured security analyzer by @malhotra5 in #723
  • Refactor hello_world.py for simplicity by @neubig in #713
  • use older version of builder so the binary is compatible by @xingyaoww in #731
  • Added run flag to send message operations by @tofarr in #729
  • Fix agent server persistence by @tofarr in #732
  • Add gpt-5-codex to OpenHands verified models by @xingyaoww in #657
  • v1.0.0a1 Release by @xingyaoww in #736

New Contributors

Full Changelog: https://github.com/All-Hands-AI/agent-sdk/commits/1.0.0a1