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 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 #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
kindsafety_riskfor executing MCP Action by @xingyaoww in #156 - fix parent fields to include
kindby consideringmodel_fields_computedby @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
thinkandtask_trackertools 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
Messageonly forLLMby @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-usetools 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_riskunless 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_messagein 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
MCPToolActionwith 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_callbacksby @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
- @malhotra5 made their first contribution in #69
- @ryanhoangt made their first contribution in #70
- @csmith49 made their first contribution in #61
- @dependabot[bot] made their first contribution in #100
- @simonrosenberg made their first contribution in #178
- @tofarr made their first contribution in #217
- @li-boxuan made their first contribution in #252
- @rbren made their first contribution in #345
- @neubig made their first contribution in #422
- @jpshackelford made their first contribution in #375
- @juanmichelini made their first contribution in #513
- @hieptl made their first contribution in #679
- @raymyers made their first contribution in #701
Full Changelog: https://github.com/All-Hands-AI/agent-sdk/commits/1.0.0a1