NousResearch/hermes-agent

Azure content filter workaround via prompt marker rename

Cluster 6576. Data as of

Nothing open on GitHub. Fix merged in #16114 on 26 Apr 2026. Check it covers your case.

The short answer

0open issues
0open PRs
4items grouped
Known?
Yes. 4 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #16114. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this resolved, deciding PR #16114. That is separate from the fix event.
Still open
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.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #16114 fix(prompts): rename [SYSTEM: → [IMPORTANT: in all user-injected markers (Azure content filter)

    merged to main

    files: agent/skill_commands.py, cli.py, cron/scheduler.py, gateway/run.py, scripts/release.py, tools/process_registry.py

    Show the diff
    • agent/skill_commands.py
      @@ -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(
      @@ -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
      @@ -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.
      @@ -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}"
      @@ -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}]"
      @@ -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
      @@ -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 "
      @@ -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,
                   ]
      @@ -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
      @@ -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}"
      @@ -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)
      @@ -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)
      @@ -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
      @@ -119,6 +119,7 @@
           "[email protected]": "nocoo",
           "[email protected]": "n-WN",
           "[redacted:email]": "hiddenpuppy",
      +    "[redacted:email]": "ygd58",
           "[redacted:email]": "HiddenPuppy",
           "[redacted:email]": "jerome-benoit",
           "[email protected]": "Wysie",
    • tools/process_registry.py
      @@ -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 ""

2 PRs closed without merging

From the close comments: closed without comment 1 · merged via another change 1

  • #6583 fix(prompts): replace [SYSTEM: with [IMPORTANT: to avoid Azure content filter · closed without comment
  • #6616 fix(prompts): replace [SYSTEM: with [IMPORTANT: to avoid Azure content filter · merged via another change → bed1921, #16114, #6576
Closed issues · 1
  • Closed#6576[Bug]: Azure OpenAI security filters block some Hermes requests due to trigger word
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.50: the share of item 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.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Merged PRs
#16114
Closed issues
1
Attempts
2 PRs closed without merging
Fix link checked
26 Apr 2026. This confirmation is old and may be out of date (a revert or reopen would not have invalidated it here); re-verify.

For your agent

The same facts, typed.