mirror of
https://github.com/Sea-Haven-Industries/open-swe.git
synced 2026-10-05 03:42:13 +00:00
feat: add configurable default prompt file for org-level agent instructions [close OPE-36] (#1187)
* feat: add configurable default prompt file for org-level agent instructions * linting * Update CUSTOMIZATION.md Co-authored-by: Brace Sproul <braceasproul@gmail.com> * fix: address PR review feedback on default prompt --------- Co-authored-by: Brace Sproul <braceasproul@gmail.com>
This commit is contained in:
parent
2039fe6660
commit
6049405aed
3 changed files with 81 additions and 2 deletions
|
|
@ -385,6 +385,45 @@ The system prompt is assembled in `agent/prompt.py` from modular sections. You c
|
||||||
| `CODE_REVIEW_GUIDELINES_SECTION` | How the agent reviews code changes |
|
| `CODE_REVIEW_GUIDELINES_SECTION` | How the agent reviews code changes |
|
||||||
| `COMMUNICATION_SECTION` | Formatting and messaging guidelines |
|
| `COMMUNICATION_SECTION` | Formatting and messaging guidelines |
|
||||||
|
|
||||||
|
### Default prompt file
|
||||||
|
|
||||||
|
Open SWE supports a `default_prompt.md` file for org-level instructions that apply to **every** agent run, regardless of which repository is being worked on. This is the recommended way to set default repository preferences, org conventions, and shared guidelines.
|
||||||
|
|
||||||
|
The file is loaded at agent startup and injected into the system prompt between the task overview and repository setup sections.
|
||||||
|
|
||||||
|
**Location:** [`default_prompt.md`](./default_prompt.md) in the project root.
|
||||||
|
|
||||||
|
**Override:** Set the `DEFAULT_PROMPT_PATH` environment variable to use a different file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
DEFAULT_PROMPT_PATH="/path/to/my-org-prompt.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Format:** Write plain markdown. The content is injected as-is under a `### Custom Instructions` heading in the system prompt. Example:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Default Prompt
|
||||||
|
|
||||||
|
## Default Repository
|
||||||
|
|
||||||
|
When no repository is specified, work on the **my-app** repository under **my-org**.
|
||||||
|
|
||||||
|
## Organization Conventions
|
||||||
|
|
||||||
|
- Use conventional commits: feat:, fix:, chore:
|
||||||
|
- Always tag the requesting user when work is complete
|
||||||
|
```
|
||||||
|
|
||||||
|
**Loading order:** Default prompt → System prompt sections → AGENTS.md (per-repo). If the file is missing or empty, it is silently skipped — no error is raised.
|
||||||
|
|
||||||
|
**When to use `default_prompt.md` vs `AGENTS.md`:**
|
||||||
|
|
||||||
|
| | `default_prompt.md` | `AGENTS.md` |
|
||||||
|
|---|---|---|
|
||||||
|
| Scope | All tasks, all repos | Single repository |
|
||||||
|
| Location | Open SWE project root | Target repo root |
|
||||||
|
| Use for | Default repo, org conventions | Repo-specific coding standards |
|
||||||
|
|
||||||
### Using AGENTS.md
|
### Using AGENTS.md
|
||||||
|
|
||||||
Drop an `AGENTS.md` file in the root of any repository to add repo-specific instructions. The agent reads it from the sandbox at startup and appends it to the system prompt. This is the easiest way to encode conventions per-repo without modifying Open SWE's code.
|
Drop an `AGENTS.md` file in the root of any repository to add repo-specific instructions. The agent reads it from the sandbox at startup and appends it to the system prompt. This is the easiest way to encode conventions per-repo without modifying Open SWE's code.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,39 @@
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from .utils.github_comments import UNTRUSTED_GITHUB_COMMENT_OPEN_TAG
|
from .utils.github_comments import UNTRUSTED_GITHUB_COMMENT_OPEN_TAG
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
DEFAULT_PROMPT_PATH = os.environ.get(
|
||||||
|
"DEFAULT_PROMPT_PATH",
|
||||||
|
str(Path(__file__).resolve().parent.parent / "default_prompt.md"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _load_default_prompt() -> str:
|
||||||
|
"""Load custom prompt from the default prompt file.
|
||||||
|
|
||||||
|
Returns empty string if the file doesn't exist or can't be read.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
path = Path(DEFAULT_PROMPT_PATH)
|
||||||
|
if path.is_file():
|
||||||
|
content = path.read_text().strip()
|
||||||
|
if content:
|
||||||
|
# Escape curly braces so .format() doesn't choke on them
|
||||||
|
escaped = content.replace("{", "{{").replace("}", "}}")
|
||||||
|
return f"""---
|
||||||
|
|
||||||
|
### Custom Instructions
|
||||||
|
|
||||||
|
{escaped}"""
|
||||||
|
except Exception:
|
||||||
|
logger.warning("Failed to read default prompt file at %s", DEFAULT_PROMPT_PATH)
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
WORKING_ENV_SECTION = """---
|
WORKING_ENV_SECTION = """---
|
||||||
|
|
||||||
### Working Environment
|
### Working Environment
|
||||||
|
|
@ -282,9 +316,10 @@ When you have completed your implementation, follow these steps in order:
|
||||||
Always call `commit_and_open_pr` followed by the appropriate reply tool once implementation is complete and code quality checks pass."""
|
Always call `commit_and_open_pr` followed by the appropriate reply tool once implementation is complete and code quality checks pass."""
|
||||||
|
|
||||||
|
|
||||||
SYSTEM_PROMPT = (
|
SYSTEM_PROMPT_TEMPLATE = (
|
||||||
WORKING_ENV_SECTION
|
WORKING_ENV_SECTION
|
||||||
+ TASK_OVERVIEW_SECTION
|
+ TASK_OVERVIEW_SECTION
|
||||||
|
+ "{default_prompt_section}"
|
||||||
+ REPO_SETUP_SECTION
|
+ REPO_SETUP_SECTION
|
||||||
+ FILE_MANAGEMENT_SECTION
|
+ FILE_MANAGEMENT_SECTION
|
||||||
+ TASK_EXECUTION_SECTION
|
+ TASK_EXECUTION_SECTION
|
||||||
|
|
@ -305,8 +340,10 @@ def construct_system_prompt(
|
||||||
linear_project_id: str = "",
|
linear_project_id: str = "",
|
||||||
linear_issue_number: str = "",
|
linear_issue_number: str = "",
|
||||||
) -> str:
|
) -> str:
|
||||||
return SYSTEM_PROMPT.format(
|
default_prompt_section = _load_default_prompt()
|
||||||
|
return SYSTEM_PROMPT_TEMPLATE.format(
|
||||||
working_dir=working_dir,
|
working_dir=working_dir,
|
||||||
linear_project_id=linear_project_id or "<PROJECT_ID>",
|
linear_project_id=linear_project_id or "<PROJECT_ID>",
|
||||||
linear_issue_number=linear_issue_number or "<ISSUE_NUMBER>",
|
linear_issue_number=linear_issue_number or "<ISSUE_NUMBER>",
|
||||||
|
default_prompt_section=default_prompt_section,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
3
default_prompt.md
Normal file
3
default_prompt.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# Default Prompt
|
||||||
|
|
||||||
|
When a repository is not explicitly mentioned, use `langchain-ai/langchainplus`. Always assume the organization is `langchain-ai`.
|
||||||
Loading…
Add table
Reference in a new issue