wooden-umbrella-84098
03/16/2026, 8:39 PMlimited-student-10747
03/16/2026, 8:44 PMcalm-artist-7206
03/16/2026, 8:56 PMwooden-umbrella-84098
03/16/2026, 9:07 PMwooden-umbrella-84098
03/16/2026, 9:08 PMcalm-artist-7206
03/16/2026, 10:17 PMwooden-umbrella-84098
03/16/2026, 10:42 PMnutritious-balloon-65098
03/16/2026, 10:43 PMlimited-student-10747
03/16/2026, 10:52 PMlimited-student-10747
03/16/2026, 10:54 PMnutritious-balloon-65098
03/16/2026, 10:55 PMopenhands-agent-server/ package and related tests
✅ APIs are backward-compatible - Existing POST /conversations continues to work with inline configurations; new reference fields are optional
✅ Support persistent named objects - Created storage and REST endpoints for:
- LLM profiles (/api/settings/llm-profiles)
- Agent configurations (/api/settings/agents)
- Secret bundles (/api/settings/secrets)
✅ Used SDK classes/concepts - Models use LLM, Agent, SecretSource, StaticSecret from the SDK; follows existing file-based persistence patterns like conversations
✅ References work in conversation creation - Added agent_name, llm_profile_name, and secrets_name fields to StartConversationRequest
✅ Tests pass - 18 new tests covering CRUD operations and reference resolution; all existing tests continue to pass
### Changes are Concise:
- No extraneous modifications - all changes directly support the feature
- Followed existing patterns (file storage, cipher encryption, service lifecycle)
### Files Changed (11 total):
- 3 new source files: settings_models.py, settings_service.py, settings_router.py
- 2 new test files: test_settings_service.py, test_settings_references.py
- 6 modified files: config.py, models.py, conversation_service.py, conversation_router.py, conversation_router_acp.py, api.py
---
I need to push the changes to complete this. The commit is ready on branch openhands-workspace-6bEA6hPlJLk6K41McbwWiZ. Would you like me to push and create a PR?limited-student-10747
03/16/2026, 10:57 PMwooden-umbrella-84098
03/16/2026, 11:30 PMwooden-umbrella-84098
03/16/2026, 11:31 PMnutritious-balloon-65098
03/16/2026, 11:33 PMopenhands-agent-server/
✅ APIs are backward-compatible - Existing conversation creation works unchanged; new fields are optional
✅ Support persistent named objects for conversation creation:
- LLM profiles (via llm_profile_name)
- Agent settings (via agent_name)
- Secrets (via secrets_name)
✅ Uses Agent SDK classes - LLM, Agent, SecretSource are used directly in models
✅ Tests written - 18 new tests covering CRUD and reference resolution
### Files Added
- settings_models.py - Pydantic models for NamedLLMProfile, NamedAgent, NamedSecrets
- settings_service.py - File-based persistence service
- settings_router.py - REST endpoints under /api/settings
- test_settings_service.py, test_settings_references.py - Tests
### Files Modified
- config.py - Added settings_path configuration
- models.py - Added optional reference fields to StartConversationRequest
- conversation_service.py - Added reference resolution logic
- conversation_router.py, conversation_router_acp.py - Added error handling
- api.py - Wired settings service and router
### Changes are Concise
All changes directly serve the feature request. No extraneous modifications.
### Status
PR created and pushed: https://github.com/OpenHands/software-agent-sdk/pull/2473limited-student-10747
03/16/2026, 11:38 PMcalm-artist-7206
03/17/2026, 11:46 AM~/.openhands/profiles
• each has a name defined by the user, e.g. gpt-5-high.json for "gpt-5-high" profile
• it contains a full configuration that an LLM can be instantiated from.
What if what we need, in clients, is to just offer an interface to the user to define a profile? For example, this is a VSCode client:calm-artist-7206
03/17/2026, 12:09 PMWe need a way to save settingsYes, for agent settings, definitely, but for LLM I'm not sure, because we have profiles now. Could that actually do the job, for LLM, and simplify our mental model of it? One thing I found, playing with a couple of clients to the SDK, was that • I started with all settings, including the 40+ LLM settings, in a Settings page(s) • added LLM Profiles feature, with their own page as you see above, for the user to define/remove/modify • that lead in the code to quite a bit of "if a profile is active then profile otherwise let's read LLM settings" • which is actually a duplicate path to the same thing: all we need is a profile. 😅 So I ended up simplifying and removed all LLM settings: those are actually the same thing with whatever the user enters in their first LLM profile, if that makes sense.
limited-student-10747
03/17/2026, 12:13 PMcalm-artist-7206
03/17/2026, 12:30 PM{
...
"agent": {
"llm": {
"profile_id": "gpt-5-mini"
},
"tools": [
{
"name": "terminal",
"params": {}
}
],...limited-student-10747
03/17/2026, 12:36 PMlimited-student-10747
03/17/2026, 12:39 PMcalm-artist-7206
03/17/2026, 12:44 PMI think that doesn't work in all cases because then you have an external dependency on a file on disk in determining the agent behavior. Currently in my design there are no external dependencies and if you have the settings object you will be able to entirely determine the agent behavior🤔 I think... maybe another way we could look at it, is like, the agent behavior can be determined from an object, but when we save that object on disk, we save it in two files, not in one file. I don't think of that as external dependency... at a minimum, the user needs to enter at least one value at all: the LLM model. So whatever we do, we still need some input from outside; once that input comes in and we save it, we can do that save in two files
calm-artist-7206
03/17/2026, 12:44 PMcalm-artist-7206
03/17/2026, 12:47 PMlimited-student-10747
03/17/2026, 12:48 PMcalm-artist-7206
03/17/2026, 12:51 PMcalm-artist-7206
03/17/2026, 12:54 PMlimited-student-10747
03/17/2026, 12:54 PM