numerous-ambulance-67850
12/23/2025, 7:29 AMnumerous-ambulance-67850
12/23/2025, 7:32 AMlimited-student-10747
12/23/2025, 1:37 PMnutritious-balloon-65098
12/23/2025, 1:38 PMnutritious-balloon-65098
12/23/2025, 1:43 PM33_remind_tool.py) in the software-agent-sdk repository that demonstrates a custom "remind" tool with deferred/async behavior.
Checklist
✅ Created the remind tool example - examples/01_standalone_sdk/33_remind_tool.py
• Custom RemindAction with message and delay_seconds parameters
• Custom RemindObservation confirming the reminder was scheduled
• RemindExecutor that receives the conversation and spawns a background thread to send the reminder after the delay
• RemindTool class with proper registration
✅ Passes conversation to tool - The ToolExecutor.__call__ method already receives the conversation parameter, which the executor uses to send deferred messages
✅ Tool can be called with message and delay - The RemindAction accepts both parameters
✅ Message is sent back to conversation after delay - The executor spawns a daemon thread that sleeps for the specified delay, then calls conversation.send_message() to inject the reminder
✅ Tests verify the tool works - Added tests/sdk/tool/test_remind_tool.py with 8 passing tests covering:
• Tool name auto-generation
• Action validation
• Observation content formatting
• Executor behavior with and without conversation
• Tool creation and registration
• Full execution flow
Pull Request
Created draft PR: https://github.com/OpenHands/software-agent-sdk/pull/1493
Would you like me to:
• Mark the PR as ready for review?
• Make any modifications to the example?
• Add additional test cases?
<sub>View full conversation</sub>limited-student-10747
12/23/2025, 1:46 PMlimited-student-10747
12/23/2025, 1:46 PMnumerous-ambulance-67850
12/23/2025, 2:28 PMnumerous-ambulance-67850
12/23/2025, 2:31 PMnutritious-balloon-65098
12/24/2025, 11:12 AMexamples/01_standalone_sdk/33_remind_tool.py) demonstrating a custom "remind" tool that:
• Accepts a message and delay in seconds
• Schedules the message to be sent back to the conversation after the delay
• Returns immediately, allowing the agent to continue working
• Uses a background thread to call conversation.send_message() after the delay
This demonstrates async/deferred tool behavior useful for human-in-the-loop scenarios.
Draft PR: https://github.com/OpenHands/software-agent-sdk/pull/1493
2. Created Issue for Workspace Pause/Resume (Issue #1504)
Created an issue proposing pause() and resume() methods for workspace classes to conserve resources during deferred operations:
Issue: https://github.com/OpenHands/software-agent-sdk/issues/1504
The proposed design:
• Base class: pause() and resume() raise NotImplementedError by default
• LocalWorkspace: Override to no-op (nothing to pause)
• DockerWorkspace: Use docker pause / docker unpause commands
• APIRemoteWorkspace: Call existing /pause and /resume endpoints
• OpenHandsCloudWorkspace: NotImplementedError for pause initially; expose existing _resume_sandbox() as public
This would allow the remind tool (and similar deferred tools) to optionally pause the workspace while waiting, then resume it before sending the message.
<sub>View full conversation</sub>numerous-ambulance-67850
12/24/2025, 11:13 AMlimited-student-10747
12/24/2025, 11:13 AMnumerous-ambulance-67850
12/24/2025, 11:13 AMlimited-student-10747
12/24/2025, 11:14 AMthis still waits on a function return valueI think my example doesn’t wait on the function return value, it immediately returns an observation, but has a hook back into the conversation to send a follow-up message when the external work is done
limited-student-10747
12/24/2025, 11:15 AMlimited-student-10747
12/24/2025, 11:16 AMnumerous-ambulance-67850
12/24/2025, 11:22 AMlimited-student-10747
12/24/2025, 11:28 AMlimited-student-10747
12/24/2025, 11:29 AMnumerous-ambulance-67850
12/24/2025, 4:09 PMWhat about using the OpenHands cloud workspaceWill try get back to you on this over the weekend, different things i have in mind.