From f56abcef4fa817d55da611f8e44dedd562c8f2c7 Mon Sep 17 00:00:00 2001 From: Nicholas Tindle Date: Wed, 11 Feb 2026 12:53:54 -0600 Subject: [PATCH] fix(classic): convert mid-conversation system messages to user messages Some LLM providers (notably Anthropic) don't support system messages in the middle of a conversation. Changed ChatMessage.system() to ChatMessage.user() for all mid-conversation context messages across components (action history, context, skills, system clock, todo, error reporting, LATS, and multi-agent debate strategies). Co-Authored-By: Claude Opus 4.6 --- .../forge/forge/components/action_history/action_history.py | 2 +- classic/forge/forge/components/context/context.py | 2 +- classic/forge/forge/components/skills/skill_component.py | 4 ++-- classic/forge/forge/components/system/system.py | 2 +- classic/forge/forge/components/todo/todo.py | 2 +- classic/original_autogpt/autogpt/agents/agent.py | 2 +- .../original_autogpt/autogpt/agents/prompt_strategies/lats.py | 2 +- .../autogpt/agents/prompt_strategies/multi_agent_debate.py | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/classic/forge/forge/components/action_history/action_history.py b/classic/forge/forge/components/action_history/action_history.py index a096c08dee..bad1359550 100644 --- a/classic/forge/forge/components/action_history/action_history.py +++ b/classic/forge/forge/components/action_history/action_history.py @@ -93,7 +93,7 @@ class ActionHistoryComponent( if step_summaries: step_summaries_fmt = "\n\n".join(step_summaries) - yield ChatMessage.system( + yield ChatMessage.user( f"## Progress on your Task so far\n" "Here is a summary of the steps that you have executed so far, " "use this as your consideration for determining the next action!\n" diff --git a/classic/forge/forge/components/context/context.py b/classic/forge/forge/components/context/context.py index c325e1adbb..9ad82d3b0c 100644 --- a/classic/forge/forge/components/context/context.py +++ b/classic/forge/forge/components/context/context.py @@ -50,7 +50,7 @@ class ContextComponent(MessageProvider, CommandProvider): def get_messages(self) -> Iterator[ChatMessage]: if self.context: - yield ChatMessage.system( + yield ChatMessage.user( "## Context\n" f"{self.context.format_numbered(self.workspace)}\n\n" "When a context item is no longer needed and you are not done yet, " diff --git a/classic/forge/forge/components/skills/skill_component.py b/classic/forge/forge/components/skills/skill_component.py index a85720cf99..ab8eb4216d 100644 --- a/classic/forge/forge/components/skills/skill_component.py +++ b/classic/forge/forge/components/skills/skill_component.py @@ -99,7 +99,7 @@ class SkillComponent( catalog_lines.append( f"- **{name}**{loaded_marker}: {skill.metadata.description}" ) - yield ChatMessage.system("\n".join(catalog_lines)) + yield ChatMessage.user("\n".join(catalog_lines)) # Provide loaded skill content for name, skill in self._loaded_skills.items(): @@ -117,7 +117,7 @@ class SkillComponent( loaded = " [loaded]" if f in skill.additional_files else "" skill_content.append(f"- `{f}`{loaded}") - yield ChatMessage.system("\n".join(skill_content)) + yield ChatMessage.user("\n".join(skill_content)) # ------------------------------------------------------------------------- # CommandProvider methods diff --git a/classic/forge/forge/components/system/system.py b/classic/forge/forge/components/system/system.py index 6139924375..718b47967c 100644 --- a/classic/forge/forge/components/system/system.py +++ b/classic/forge/forge/components/system/system.py @@ -85,7 +85,7 @@ class SystemComponent(DirectiveProvider, MessageProvider, CommandProvider): def get_messages(self) -> Iterator[ChatMessage]: # Clock - yield ChatMessage.system( + yield ChatMessage.user( f"## Clock\nThe current time and date is {time.strftime('%c')}" ) diff --git a/classic/forge/forge/components/todo/todo.py b/classic/forge/forge/components/todo/todo.py index 12cb9d8ec5..06721e98e0 100644 --- a/classic/forge/forge/components/todo/todo.py +++ b/classic/forge/forge/components/todo/todo.py @@ -208,7 +208,7 @@ class TodoComponent( if completed: lines.append(f"\n**Completed:** {len(completed)} task(s)") - yield ChatMessage.system("\n".join(lines)) + yield ChatMessage.user("\n".join(lines)) # ------------------------------------------------------------------------- # Helper Methods diff --git a/classic/original_autogpt/autogpt/agents/agent.py b/classic/original_autogpt/autogpt/agents/agent.py index 42632a7912..b9849409fa 100644 --- a/classic/original_autogpt/autogpt/agents/agent.py +++ b/classic/original_autogpt/autogpt/agents/agent.py @@ -342,7 +342,7 @@ class Agent(BaseAgent[AnyActionProposal], Configurable[AgentSettings]): self, prompt: ChatPrompt, exception: Optional[Exception] = None ) -> AnyActionProposal: if exception: - prompt.messages.append(ChatMessage.system(f"Error: {exception}")) + prompt.messages.append(ChatMessage.user(f"Error: {exception}")) # Build thinking/reasoning kwargs from app config thinking_kwargs: dict[str, Any] = {} diff --git a/classic/original_autogpt/autogpt/agents/prompt_strategies/lats.py b/classic/original_autogpt/autogpt/agents/prompt_strategies/lats.py index 93d32418c3..1072c58c4e 100644 --- a/classic/original_autogpt/autogpt/agents/prompt_strategies/lats.py +++ b/classic/original_autogpt/autogpt/agents/prompt_strategies/lats.py @@ -235,7 +235,7 @@ class LATSPromptStrategy(BaseMultiStepPromptStrategy): ChatMessage.system(system_prompt), ChatMessage.user(f'Task: """{task}"""'), *messages, - ChatMessage.system(lats_context), + ChatMessage.user(lats_context), ChatMessage.user(self._get_phase_instruction()), ], prefill_response='{\n "thoughts":', diff --git a/classic/original_autogpt/autogpt/agents/prompt_strategies/multi_agent_debate.py b/classic/original_autogpt/autogpt/agents/prompt_strategies/multi_agent_debate.py index c030a62619..471b24ccd7 100644 --- a/classic/original_autogpt/autogpt/agents/prompt_strategies/multi_agent_debate.py +++ b/classic/original_autogpt/autogpt/agents/prompt_strategies/multi_agent_debate.py @@ -219,7 +219,7 @@ class MultiAgentDebateStrategy(BaseMultiStepPromptStrategy): ChatMessage.system(system_prompt), ChatMessage.user(f'Task: """{task}"""'), *messages, - ChatMessage.system(debate_context), + ChatMessage.user(debate_context), ChatMessage.user(self._get_phase_instruction(task)), ], prefill_response='{\n "thoughts":',