Skip to content

Commit 0f438b5

Browse files
Merge branch 'main' into feat/acp-remote-runtime
2 parents fade5af + 46f3d78 commit 0f438b5

File tree

48 files changed

+2582
-595
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2582
-595
lines changed
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
---
2+
name: Bug
3+
description: Report a problem with OpenHands SDK
4+
title: '[Bug]: '
5+
labels: [bug]
6+
body:
7+
- type: markdown
8+
attributes:
9+
value: |
10+
## Thank you for reporting a bug! 🐛
11+
12+
**Please fill out all required fields.** Issues missing critical information (version, installation method, reproduction steps, etc.) will be delayed or closed until complete details are provided.
13+
14+
Clear, detailed reports help us resolve issues faster.
15+
16+
- type: checkboxes
17+
attributes:
18+
label: Is there an existing issue for the same bug?
19+
description: Please search existing issues before creating a new one. If found, react or comment to the duplicate issue instead of making a
20+
new one. <!-- TODO-openhands -->
21+
options:
22+
- label: I have searched existing issues and this is not a duplicate.
23+
required: true
24+
25+
- type: textarea
26+
id: bug-description
27+
attributes:
28+
label: Bug Description
29+
description: Clearly describe what went wrong. Be specific and concise.
30+
placeholder: Example - When I use the SDK to create an agent with custom tools, the agent fails to register the tools with a TypeError.
31+
validations:
32+
required: true
33+
34+
- type: textarea
35+
id: expected-behavior
36+
attributes:
37+
label: Expected Behavior
38+
description: What did you expect to happen?
39+
placeholder: Example - The agent should successfully register custom tools and make them available for use.
40+
validations:
41+
required: false
42+
43+
- type: textarea
44+
id: actual-behavior
45+
attributes:
46+
label: Actual Behavior
47+
description: What actually happened?
48+
placeholder: "Example - TypeError: 'NoneType' object is not iterable when calling agent.register_tool()"
49+
validations:
50+
required: false
51+
52+
- type: textarea
53+
id: reproduction-steps
54+
attributes:
55+
label: Steps to Reproduce
56+
description: Provide clear, step-by-step instructions to reproduce the bug.
57+
placeholder: |
58+
1. Install openhands-sdk using pip
59+
2. Import and create an agent instance
60+
3. Define a custom tool function
61+
4. Call agent.register_tool(custom_tool)
62+
5. Error appears
63+
validations:
64+
required: false
65+
66+
- type: input
67+
id: installation
68+
attributes:
69+
label: Installation Method
70+
description: How did you install the OpenHands SDK?
71+
placeholder: ex. pip install openhands-sdk, uv pip install openhands-sdk, pip install -e ., etc.
72+
73+
- type: input
74+
id: installation-other
75+
attributes:
76+
label: If you selected "Other", please specify
77+
description: Describe your installation method
78+
placeholder: ex. Poetry, conda, custom setup, etc.
79+
80+
- type: input
81+
id: sdk-version
82+
attributes:
83+
label: SDK Version
84+
description: What version are you using? Check with `pip show openhands-sdk` or similar for other packages.
85+
placeholder: ex. 0.1.0, 0.2.0, main branch, commit hash, etc.
86+
validations:
87+
required: false
88+
89+
- type: checkboxes
90+
id: version-confirmation
91+
attributes:
92+
label: Version Confirmation
93+
description: Bugs on older versions may already be fixed. Please upgrade before submitting.
94+
options:
95+
- label: I have confirmed this bug exists on the LATEST version of OpenHands SDK
96+
required: false
97+
98+
- type: input
99+
id: python-version
100+
attributes:
101+
label: Python Version
102+
description: Which Python version are you using?
103+
placeholder: ex. 3.10.12, 3.11.5, 3.12.0
104+
validations:
105+
required: false
106+
107+
- type: input
108+
id: model-name
109+
attributes:
110+
label: Model Name (if applicable)
111+
description: Which model(s) are you using?
112+
placeholder: ex. gpt-4o, claude-3-5-sonnet-20241022, openrouter/deepseek-r1, etc.
113+
validations:
114+
required: false
115+
116+
- type: dropdown
117+
id: os
118+
attributes:
119+
label: Operating System
120+
options:
121+
- MacOS
122+
- Linux
123+
- WSL on Windows
124+
- Windows
125+
- Other
126+
validations:
127+
required: false
128+
129+
- type: textarea
130+
id: logs
131+
attributes:
132+
label: Logs and Error Messages
133+
description: |
134+
**Paste relevant logs, error messages, or stack traces.** Use code blocks (```) for formatting.
135+
136+
Include full stack traces when available.
137+
placeholder: |
138+
```
139+
Paste error logs here
140+
```
141+
142+
- type: textarea
143+
id: code-sample
144+
attributes:
145+
label: Minimal Code Sample
146+
description: |
147+
If possible, provide a minimal code sample that reproduces the issue.
148+
placeholder: |
149+
```python
150+
from openhands.sdk import Agent
151+
152+
# Your minimal reproducible code here
153+
```
154+
155+
- type: textarea
156+
id: additional-context
157+
attributes:
158+
label: Screenshots and Additional Context
159+
description: |
160+
Add screenshots, environment details, dependency versions, or other context that helps explain the issue.
161+
162+
placeholder: Drag and drop screenshots here, paste links, or add additional context.
163+
164+
- type: markdown
165+
attributes:
166+
value: |
167+
---
168+
**Note:** Please help us help you! Well-documented bugs are easier to reproduce and fix. Thank you for your understanding!
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
---
2+
name: Feature Request or Enhancement
3+
description: Suggest a new feature or improvement for OpenHands SDK
4+
title: '[Feature]: '
5+
labels: [enhancement]
6+
body:
7+
- type: markdown
8+
attributes:
9+
value: |
10+
## Thank you for suggesting a feature! 💡
11+
12+
We encourage you to open the discussion on the feature you need. You are always welcome to implement it, if you wish.
13+
14+
- type: checkboxes
15+
attributes:
16+
label: Is there an existing feature request for this?
17+
description: Please search existing issues and feature requests before creating a new one. If found, react or comment to the duplicate issue
18+
instead of making a new one. <!-- TODO-openhands -->
19+
options:
20+
- label: I have searched existing issues and feature requests, and this is not a duplicate.
21+
required: true
22+
23+
- type: textarea
24+
id: problem-statement
25+
attributes:
26+
label: Problem or Use Case
27+
description: What problem are you trying to solve? What use case would this feature enable?
28+
placeholder: |
29+
Example - As a developer building agents, I need to persist agent state between sessions. Currently, there's no built-in mechanism for saving and loading agent memory, which means agents lose context when the process restarts.
30+
validations:
31+
required: true
32+
33+
- type: textarea
34+
id: proposed-solution
35+
attributes:
36+
label: Proposed Solution
37+
description: Describe your ideal solution. What should this feature do? How should it work?
38+
placeholder: |
39+
Example - Add a StateManager class that allows saving and loading agent state to/from disk or database. Provide methods like save_state(), load_state(), and clear_state(). Support multiple backend options (JSON files, SQLite, Redis, etc.).
40+
validations:
41+
required: true
42+
43+
- type: textarea
44+
id: alternatives
45+
attributes:
46+
label: Alternatives Considered
47+
description: Have you considered any alternative solutions or workarounds? What are their limitations?
48+
placeholder: Example - I tried manually serializing agent state using pickle, but it's not portable across SDK versions and doesn't handle
49+
complex tool state properly.
50+
51+
- type: dropdown
52+
id: priority
53+
attributes:
54+
label: Priority / Severity
55+
description: How important is this feature to your workflow?
56+
options:
57+
- Critical - Blocking my work, no workaround available
58+
- High - Significant impact on productivity
59+
- Medium - Would improve experience
60+
- Low - Nice to have
61+
default: 2
62+
validations:
63+
required: true
64+
65+
- type: dropdown
66+
id: scope
67+
attributes:
68+
label: Estimated Scope
69+
description: To the best of your knowledge, how complex do you think this feature would be to implement?
70+
options:
71+
- Small - API addition, config option, or minor change
72+
- Medium - New feature with moderate complexity
73+
- Large - Significant feature requiring architecture changes
74+
- Unknown - Not sure about the technical complexity
75+
default: 3
76+
77+
- type: checkboxes
78+
id: feature-area
79+
attributes:
80+
label: Feature Area
81+
description: Which part of OpenHands SDK does this feature relate to? If you select "Other", please specify the area in the Additional
82+
Context section below. <!-- TODO-openhands -->
83+
options:
84+
- label: Agent API / Core functionality
85+
- label: Tools / Tool system
86+
- label: Skills / Plugins
87+
- label: Agent Server
88+
- label: Workspace management
89+
- label: Configuration / Settings
90+
- label: Examples / Templates
91+
- label: Documentation
92+
- label: Testing / Development tools
93+
- label: Performance / Optimization
94+
- label: Integrations (GitHub, APIs, etc.)
95+
- label: Other
96+
97+
- type: textarea
98+
id: technical-details
99+
attributes:
100+
label: Technical Implementation Ideas (Optional)
101+
description: If you have technical expertise, share implementation ideas, API suggestions, or relevant technical details.
102+
placeholder: |
103+
Example - Could implement StateManager as an abstract base class with concrete implementations for different backends. Add state_manager parameter to Agent constructor. Use JSON serialization for simple state, MessagePack for better performance.
104+
105+
- type: textarea
106+
id: additional-context
107+
attributes:
108+
label: Additional Context
109+
description: Add any other context, code examples, API mockups, or references that help illustrate this feature request.
110+
placeholder: |
111+
Example code or API design:
112+
```python
113+
from openhands.sdk import Agent, StateManager
114+
115+
agent = Agent(state_manager=StateManager('file://agent_state.json'))
116+
agent.save_state()
117+
```

.github/run-eval/resolve_model_config.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,14 @@
140140
"reasoning_effort": "high",
141141
},
142142
},
143+
"gpt-5.4": {
144+
"id": "gpt-5.4",
145+
"display_name": "GPT-5.4",
146+
"llm_config": {
147+
"model": "litellm_proxy/openai/gpt-5.4",
148+
"reasoning_effort": "high",
149+
},
150+
},
143151
"minimax-m2": {
144152
"id": "minimax-m2",
145153
"display_name": "MiniMax M2",

.github/workflows/run-eval.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ on:
2424
sdk_ref:
2525
description: SDK commit/ref to evaluate (must be a semantic version like v1.0.0 unless 'Allow unreleased branches' is checked)
2626
required: true
27-
default: v1.12.0
27+
default: v1.13.0
28+
2829

2930

3031
allow_unreleased_branches:

AGENTS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,8 @@ Note: This is separate from `persistence_dir` which is used for conversation sta
297297
- Build agent-server: `make build-server` (output: `dist/agent-server/`)
298298
- Clean caches: `make clean`
299299
- Run SDK examples: see [openhands-sdk/openhands/sdk/AGENTS.md](openhands-sdk/openhands/sdk/AGENTS.md).
300+
- The example workflow runs `uv run pytest tests/examples/test_examples.py --run-examples`; each successful example must print an `EXAMPLE_COST: ...` line to stdout (use `EXAMPLE_COST: 0` for non-LLM examples).
301+
- Conversation plugins passed via `plugins=[...]` are lazy-loaded on the first `send_message()` or `run()`, so example code should inspect plugin-added skills or `resolved_plugins` only after that first interaction.
300302
</QUICK_COMMANDS>
301303

302304
<REPO_CONFIG_NOTES>

examples/01_standalone_sdk/43_mixed_marketplace_skills/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,4 @@ def main():
116116

117117
if __name__ == "__main__":
118118
main()
119+
print("EXAMPLE_COST: 0")

0 commit comments

Comments
 (0)