feat(agent): add custom-agent self-updates with user isolation#2713
feat(agent): add custom-agent self-updates with user isolation#2713WillemJiang merged 6 commits intobytedance:mainfrom
Conversation
…tes (bytedance#2616) Custom agents had no built-in way to persist updates to their own SOUL.md / config.yaml from a normal chat — `setup_agent` was only bound during the bootstrap flow, so when the user asked the agent to refine its description or personality, the agent would shell out via bash/write_file and the edits landed in a temporary sandbox/tool workspace instead of `{base_dir}/agents/{agent_name}/`. Changes: - New `update_agent` builtin tool with partial-update semantics (only the fields you pass are written) and atomic temp-file + os.replace writes so a failed update never corrupts existing SOUL.md / config.yaml. - Lead agent now binds `update_agent` in the non-bootstrap path whenever `agent_name` is set in the runtime context. Default agent (no agent_name) and bootstrap flow are unchanged. - New `<self_update>` system-prompt section is injected for custom agents, instructing them to use `update_agent` — and explicitly NOT bash / write_file — to persist self-updates. - Tests: 11 new cases in `tests/test_update_agent_tool.py` covering validation (missing/invalid agent_name, unknown agent, no fields), partial updates (soul-only, description-only, skills=[] vs omitted), no-op detection, atomic-write safety, and AgentConfig round-tripping; plus 2 new cases in `tests/test_lead_agent_prompt.py` covering the self-update prompt section. - Docs: updated backend/CLAUDE.md builtin tools list and tools.mdx (en/zh) with the new tool description.
|
@yangzheli, thanks for the contribution. Since we don't want to share the agent across the system, we should use the user ID to separate the agent settings and prevent other users from accessing the agent. |
There was a problem hiding this comment.
Pull request overview
Adds a first-class mechanism for custom agents to persist self-updates (SOUL/config) from within normal chat runs, avoiding sandbox-local edits and ensuring changes apply on subsequent turns.
Changes:
- Introduces a new builtin tool
update_agentwith partial-update semantics and atomic per-file writes forSOUL.mdandconfig.yaml. - Binds
update_agentto the lead agent only for non-bootstrap custom-agent sessions and injects a<self_update>prompt section guiding correct usage. - Adds backend tests and updates docs (EN/ZH) to describe the new tool and behavior.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/src/content/zh/harness/tools.mdx | Documents update_agent usage and partial-update semantics (ZH). |
| frontend/src/content/en/harness/tools.mdx | Documents update_agent usage and partial-update semantics (EN). |
| backend/tests/test_update_agent_tool.py | Adds validation/behavior/atomicity tests for update_agent. |
| backend/tests/test_lead_agent_prompt.py | Adds coverage for the new <self_update> prompt section. |
| backend/packages/harness/deerflow/tools/builtins/update_agent_tool.py | Implements the update_agent tool and atomic write helper. |
| backend/packages/harness/deerflow/tools/builtins/init.py | Exports update_agent from builtin tools. |
| backend/packages/harness/deerflow/agents/lead_agent/prompt.py | Injects <self_update> section for custom agents. |
| backend/packages/harness/deerflow/agents/lead_agent/agent.py | Binds update_agent only for non-bootstrap custom-agent sessions. |
| backend/CLAUDE.md | Updates builtin tools list to include update_agent. |
…at/agent-user-isolation
Store custom agent definitions under the effective user, keep legacy agents readable until migration, and cover API/tool/migration behavior with tests. Co-authored-by: Cursor <cursoragent@cursor.com>
Addressed all review comments in a8a4aa4. The custom agent is now persisted under the effective user. Please take another look when you have a moment. |
|
@yangzheli Here are some additional comments for this PR, please check them out.
|
|
Addressed in abd35d4.
|
Fixes #2616、#2722
Summary
update_agentbuiltin and custom-agent prompt guidance so agents can persist their ownSOUL.md/config.yamlupdates through the supported tool path instead of shell orwrite_file.{base_dir}/users/{user_id}/agents/{agent_name}/, while keeping the legacy shared{base_dir}/agents/{agent_name}/layout readable as an unmigrated fallback.setup_agent/update_agenttooling to resolve agents in user context and avoid name collisions with legacy shared agents.migration-conflictsfor manual review.Test plan
ruff lint,ruff format.Screenshot
After