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
- 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
Open PRs0
Fixes on record
-
#16114 fix(prompts): rename [SYSTEM: → [IMPORTANT: in all user-injected markers (Azure content filter)
files:
agent/skill_commands.py,cli.py,cron/scheduler.py,gateway/run.py,scripts/release.py,tools/process_registry.pyShow 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
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.00means 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 LabAt 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.