mirror of
https://github.com/davidkaya/aryx.git
synced 2026-08-07 04:08:45 +02:00
fix: strengthen group chat collaboration guidance
Audit confirmed that single, sequential, concurrent, and handoff are mapped to distinct workflow builders as intended. Group-chat was also using the correct round-robin manager, but the agents only had one-shot role prompts, so the reviewer could behave like a fresh assistant instead of refining the draft in progress. Add explicit runtime guidance for group-chat participants plus clearer built-in Writer/Reviewer instructions and regression coverage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -20,6 +20,25 @@ internal static class AgentInstructionComposer
|
|||||||
"""
|
"""
|
||||||
: string.Empty;
|
: string.Empty;
|
||||||
|
|
||||||
|
if (string.Equals(pattern.Mode, "group-chat", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
string groupChatGuidance = agentIndex == 0
|
||||||
|
? """
|
||||||
|
You are participating in a collaborative multi-turn group chat under a round-robin manager.
|
||||||
|
On your first turn, produce the initial draft for the user.
|
||||||
|
On later turns, refine your earlier draft based on the other agents' feedback instead of restarting from scratch.
|
||||||
|
Do not greet the user again or reset the conversation once work is underway.
|
||||||
|
"""
|
||||||
|
: """
|
||||||
|
You are participating in a collaborative multi-turn group chat under a round-robin manager.
|
||||||
|
Build on the latest draft from the other agents and contribute specific critique or improvements.
|
||||||
|
Do not restart the conversation, greet the user again, or answer as though no draft exists yet.
|
||||||
|
Focus on refining the answer already in progress.
|
||||||
|
""";
|
||||||
|
|
||||||
|
return JoinInstructionBlocks(baseInstructions, workspaceGuidance, groupChatGuidance);
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.Equals(pattern.Mode, "handoff", StringComparison.OrdinalIgnoreCase))
|
if (!string.Equals(pattern.Mode, "handoff", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return JoinInstructionBlocks(baseInstructions, workspaceGuidance);
|
return JoinInstructionBlocks(baseInstructions, workspaceGuidance);
|
||||||
|
|||||||
@@ -25,6 +25,34 @@ public sealed class AgentInstructionComposerTests
|
|||||||
Assert.Equal("Review the proposal.", instructions);
|
Assert.Equal("Review the proposal.", instructions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Compose_StrengthensGroupChatCollaborationRoles()
|
||||||
|
{
|
||||||
|
PatternDefinitionDto pattern = new()
|
||||||
|
{
|
||||||
|
Id = "pattern-group-chat",
|
||||||
|
Name = "Group Chat",
|
||||||
|
Mode = "group-chat",
|
||||||
|
Availability = "available",
|
||||||
|
};
|
||||||
|
PatternAgentDefinitionDto writer = CreateAgent(
|
||||||
|
id: "agent-group-writer",
|
||||||
|
name: "Writer",
|
||||||
|
instructions: "Draft an answer.");
|
||||||
|
PatternAgentDefinitionDto reviewer = CreateAgent(
|
||||||
|
id: "agent-group-reviewer",
|
||||||
|
name: "Reviewer",
|
||||||
|
instructions: "Review the draft.");
|
||||||
|
|
||||||
|
string writerInstructions = AgentInstructionComposer.Compose(pattern, writer, agentIndex: 0);
|
||||||
|
string reviewerInstructions = AgentInstructionComposer.Compose(pattern, reviewer, agentIndex: 1);
|
||||||
|
|
||||||
|
Assert.Contains("collaborative multi-turn group chat", writerInstructions, StringComparison.OrdinalIgnoreCase);
|
||||||
|
Assert.Contains("refine your earlier draft", writerInstructions, StringComparison.OrdinalIgnoreCase);
|
||||||
|
Assert.Contains("specific critique or improvements", reviewerInstructions, StringComparison.OrdinalIgnoreCase);
|
||||||
|
Assert.Contains("Do not restart the conversation", reviewerInstructions, StringComparison.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Compose_StrengthensHandoffTriageInstructions()
|
public void Compose_StrengthensHandoffTriageInstructions()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -204,7 +204,8 @@ export function createBuiltinPatterns(timestamp: string): PatternDefinition[] {
|
|||||||
id: 'agent-group-writer',
|
id: 'agent-group-writer',
|
||||||
name: 'Writer',
|
name: 'Writer',
|
||||||
description: 'Produces candidate answers.',
|
description: 'Produces candidate answers.',
|
||||||
instructions: 'You draft a concise, useful answer for the task.',
|
instructions:
|
||||||
|
'You draft a concise, useful answer for the task. On later turns, refine your earlier draft based on peer feedback rather than restarting.',
|
||||||
model: defaultModels.gpt54,
|
model: defaultModels.gpt54,
|
||||||
reasoningEffort: 'medium',
|
reasoningEffort: 'medium',
|
||||||
},
|
},
|
||||||
@@ -212,7 +213,8 @@ export function createBuiltinPatterns(timestamp: string): PatternDefinition[] {
|
|||||||
id: 'agent-group-reviewer',
|
id: 'agent-group-reviewer',
|
||||||
name: 'Reviewer',
|
name: 'Reviewer',
|
||||||
description: 'Critiques and refines the answer.',
|
description: 'Critiques and refines the answer.',
|
||||||
instructions: 'You review the latest answer and improve it when needed.',
|
instructions:
|
||||||
|
'You review the latest draft and offer specific improvements. Focus on critique and refinement instead of restarting the conversation.',
|
||||||
model: defaultModels.claude,
|
model: defaultModels.claude,
|
||||||
reasoningEffort: 'medium',
|
reasoningEffort: 'medium',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -90,4 +90,15 @@ describe('pattern validation', () => {
|
|||||||
expect(handoff?.agents[1].instructions).toContain('own the substantive answer');
|
expect(handoff?.agents[1].instructions).toContain('own the substantive answer');
|
||||||
expect(handoff?.agents[2].instructions).toContain('own the substantive answer');
|
expect(handoff?.agents[2].instructions).toContain('own the substantive answer');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('group chat builtin instructions frame iterative drafting and review', () => {
|
||||||
|
const groupChat = createBuiltinPatterns(BUILTIN_TIMESTAMP).find(
|
||||||
|
(pattern) => pattern.mode === 'group-chat',
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(groupChat).toBeDefined();
|
||||||
|
expect(groupChat?.agents[0].instructions).toContain('refine your earlier draft');
|
||||||
|
expect(groupChat?.agents[1].instructions).toContain('specific improvements');
|
||||||
|
expect(groupChat?.agents[1].instructions).toContain('instead of restarting the conversation');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user