# NousResearch/hermes-agent · Azure content filter workaround via prompt marker rename

## Open now

- Nothing open on GitHub.

These items address Azure OpenAI content filter blocks triggered by the '\[SYSTEM:' marker in user-injected prompts, proposing or applying a rename to '\[IMPORTANT:' as a workaround. The bug report and fixes all center on the same specific trigger-word issue.

## TL;DR

- 4 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 2 PR(s) closed without merging.
- A fix was merged to main in PR #16114. Verify it addresses your case.
- **Recommended:** read PR #16114 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `resolved` · deciding PR(s): `pr-16114`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.50`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #6576: \[Bug\]: Azure OpenAI security filters block some Hermes requests due to trigger word

## Prior & competing PRs

- **#16114: fix(prompts): rename \[SYSTEM: → \[IMPORTANT: in all user-injected markers (Azure content filter)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `agent/skill_commands.py`, `cli.py`, `cron/scheduler.py`, `gateway/run.py`, `scripts/release.py`, `tools/process_registry.py`
  - fix hunks:
  - `agent/skill_commands.py`

    ```diff
    @@ -329,7 +329,7 @@ def build_skill_invocation_message(
     
         loaded_skill, skill_dir, skill_name = loaded
         activation_note = (
    -        f'[SYSTEM: The user has invoked the "{skill_name}" skill, indicating they want '
    +        f'[IMPORTANT: The user has invoked the "{skill_name}" skill, indicating they want '
             "you to follow its instructions. The full skill content is loaded below.]"
         )
         return _build_skill_message(
    ```

    ```diff
    @@ -368,7 +368,7 @@ def build_preloaded_skills_prompt(
     
             loaded_skill, skill_dir, skill_name = loaded
             activation_note = (
    -            f'[SYSTEM: The user launched this CLI session with the "{skill_name}" skill '
    +            f'[IMPORTANT: The user launched this CLI session with the "{skill_name}" skill '
                 "preloaded. Treat its instructions as active guidance for the duration of this "
                 "session unless the user overrides them.]"
             )
    ```
  - `cli.py`

    ```diff
    @@ -1378,7 +1378,7 @@ def _resolve_attachment_path(raw_path: str) -> Path | None:
     
     
     def _format_process_notification(evt: dict) -> "str | None":
    -    """Format a process notification event into a [SYSTEM: ...] message.
    +    """Format a process notification event into a [IMPORTANT: ...] message.
     
         Handles both completion events (notify_on_complete) and watch pattern
         match events from the unified completion_queue.
    ```

    ```diff
    @@ -1388,14 +1388,14 @@ def _format_process_notification(evt: dict) -> "str | None":
         _cmd = evt.get("command", "unknown")
     
         if evt_type == "watch_disabled":
    -        return f"[SYSTEM: {evt.get('message', '')}]"
    +        return f"[IMPORTANT: {evt.get('message', '')}]"
     
         if evt_type == "watch_match":
             _pat = evt.get("pattern", "?")
             _out = evt.get("output", "")
             _sup = evt.get("suppressed", 0)
             text = (
    -            f"[SYSTEM: Background process {_sid} matched "
    +            f"[IMPORTANT: Background process {_sid} matched "
                 f"watch pattern \"{_pat}\".\n"
                 f"Command: {_cmd}\n"
                 f"Matched output:\n{_out}"
    ```

    ```diff
    @@ -1409,7 +1409,7 @@ def _format_process_notification(evt: dict) -> "str | None":
         _exit = evt.get("exit_code", "?")
         _out = evt.get("output", "")
         return (
    -        f"[SYSTEM: Background process {_sid} completed "
    +        f"[IMPORTANT: Background process {_sid} completed "
             f"(exit code {_exit}).\n"
             f"Command: {_cmd}\n"
             f"Output:\n{_out}]"
    ```

    ```diff
    @@ -7217,7 +7217,7 @@ def _reload_mcp(self):
                 change_detail = ". ".join(change_parts) + ". " if change_parts else ""
                 self.conversation_history.append({
                     "role": "user",
    -                "content": f"[SYSTEM: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
    +                "content": f"[IMPORTANT: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
                 })
     
                 # Persist session immediately so the session log reflects the
    ```
  - `cron/scheduler.py`

    ```diff
    @@ -715,7 +715,7 @@ def _build_job_prompt(job: dict, prerun_script: Optional[tuple] = None) -> str:
         # Always prepend cron execution guidance so the agent knows how
         # delivery works and can suppress delivery when appropriate.
         cron_hint = (
    -        "[SYSTEM: You are running as a scheduled cron job. "
    +        "[IMPORTANT: You are running as a scheduled cron job. "
             "DELIVERY: Your final response will be automatically delivered "
             "to the user — do NOT use send_message or try to deliver "
             "the output yourself. Just produce your report/output as your "
    ```

    ```diff
    @@ -751,7 +751,7 @@ def _build_job_prompt(job: dict, prerun_script: Optional[tuple] = None) -> str:
                 parts.append("")
             parts.extend(
                 [
    -                f'[SYSTEM: The user has invoked the "{skill_name}" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]',
    +                f'[IMPORTANT: The user has invoked the "{skill_name}" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]',
                     "",
                     content,
                 ]
    ```

    ```diff
    @@ -759,7 +759,7 @@ def _build_job_prompt(job: dict, prerun_script: Optional[tuple] = None) -> str:
     
         if skipped:
             notice = (
    -            f"[SYSTEM: The following skill(s) were listed for this job but could not be found "
    +            f"[IMPORTANT: The following skill(s) were listed for this job but could not be found "
                 f"and were skipped: {', '.join(skipped)}. "
                 f"Start your response with a brief notice so the user is aware, e.g.: "
                 f"'⚠️ Skill(s) not found and skipped: {', '.join(skipped)}']"
    ```
  - `gateway/run.py`

    ```diff
    @@ -591,20 +591,20 @@ def _parse_session_key(session_key: str) -> "dict | None":
     
     
     def _format_gateway_process_notification(evt: dict) -> "str | None":
    -    """Format a watch pattern event from completion_queue into a [SYSTEM:] message."""
    +    """Format a watch pattern event from completion_queue into a [IMPORTANT:] message."""
         evt_type = evt.get("type", "completion")
         _sid = evt.get("session_id", "unknown")
         _cmd = evt.get("command", "unknown")
     
         if evt_type == "watch_disabled":
    -        return f"[SYSTEM: {evt.get('message', '')}]"
    +        return f"[IMPORTANT: {evt.get('message', '')}]"
     
         if evt_type == "watch_match":
             _pat = evt.get("pattern", "?")
             _out = evt.get("output", "")
             _sup = evt.get("suppressed", 0)
             text = (
    -            f"[SYSTEM: Background process {_sid} matched "
    +            f"[IMPORTANT: Background process {_sid} matched "
                 f"watch pattern \"{_pat}\".\n"
                 f"Command: {_cmd}\n"
                 f"Matched output:\n{_out}"
    ```

    ```diff
    @@ -4232,7 +4232,7 @@ async def _handle_message_with_agent(self, event, source, _quick_key: str, run_g
                         if _loaded:
                             _loaded_skill, _skill_dir, _display_name = _loaded
                             _note = (
    -                            f'[SYSTEM: The "{_display_name}" skill is auto-loaded. '
    +                            f'[IMPORTANT: The "{_display_name}" skill is auto-loaded. '
                                 f"Follow its instructions for this session.]"
                             )
                             _part = _build_skill_message(_loaded_skill, _skill_dir, _note)
    ```

    ```diff
    @@ -7473,7 +7473,7 @@ async def _handle_reload_mcp_command(self, event: MessageEvent) -> str:
                 change_detail = ". ".join(change_parts) + ". " if change_parts else ""
                 reload_msg = {
                     "role": "user",
    -                "content": f"[SYSTEM: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
    +                "content": f"[IMPORTANT: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
                 }
                 try:
                     session_entry = self.session_store.get_or_create_session(event.source)
    ```

    ```diff
    @@ -8412,7 +8412,7 @@ async def _run_process_watcher(self, watcher: dict) -> None:
                         from tools.ansi_strip import strip_ansi
                         _out = strip_ansi(session.output_buffer[-2000:]) if session.output_buffer else ""
                         synth_text = (
    -                        f"[SYSTEM: Background process {session_id} completed "
    +                        f"[IMPORTANT: Background process {session_id} completed "
                             f"(exit code {session.exit_code}).\n"
                             f"Command: {session.command}\n"
                             f"Output:\n{_out}]"
    ```
  - `scripts/release.py`

    ```diff
    @@ -119,6 +119,7 @@
         "nocoo@users.noreply.github.com": "nocoo",
         "30841158+n-WN@users.noreply.github.com": "n-WN",
         "[redacted:email]": "hiddenpuppy",
    +    "[redacted:email]": "ygd58",
         "[redacted:email]": "HiddenPuppy",
         "[redacted:email]": "jerome-benoit",
         "wysie@users.noreply.github.com": "Wysie",
    ```
  - `tools/process_registry.py`

    ```diff
    @@ -776,7 +776,7 @@ def _move_to_finished(self, session: ProcessSession):
     
             # Only enqueue completion notification on the FIRST move.  Without
             # this guard, kill_process() and the reader thread can both call
    -        # _move_to_finished(), producing duplicate [SYSTEM: ...] messages.
    +        # _move_to_finished(), producing duplicate [IMPORTANT: ...] messages.
             if was_running and session.notify_on_complete:
                 from tools.ansi_strip import strip_ansi
                 output_tail = strip_ansi(session.output_buffer[-2000:]) if session.output_buffer else ""
    ```
- **#6583: fix(prompts): replace \[SYSTEM: with \[IMPORTANT: to avoid Azure content filter**. closed without merge
  - maintainer direction: category `silent_close`; implication `active`
- **#6616: fix(prompts): replace \[SYSTEM: with \[IMPORTANT: to avoid Azure content filter**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `bed192135`, `#16114`, `#6576`

## Fix status

- Merged to main in PR #16114 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-04-26`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
