| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import { type AgentDefinition, resolvePrompt } from './orchestrator';
- import { createSynthesisOnlyPermission } from './permissions';
- // NOTE: Councillor system prompts live in the councillor agent factory.
- // The council agent synthesizes councillor responses passed by the orchestrator.
- const COUNCIL_SYNTHESIS_REINFORCEMENT = `\n\n---\n\nYou MUST follow the Synthesis Process steps before producing output: review each councillor response individually by name, then produce the required output with a synthesized Council Response, a Per-Councillor Details section using each councillor's exact seat name (e.g. "alpha", not the model label), and a Council Summary with Consensus Level (unanimous|majority|split), Agreed Points, Disagreements + resolution, Remaining Uncertainty, and Recommended Action.`;
- const COUNCIL_AGENT_PROMPT = `You are the Council agent - a \
- synthesizer for multi-model consensus.
- **Role**: You receive raw responses from multiple councillors (different models) and synthesize them into a structured council report. You do NOT dispatch councillors yourself - the orchestrator handles dispatch and provides the councillor results.
- **Tools**: You have NO tools. You synthesize purely from the councillor responses provided in your context. Do not read, glob, grep, or run shell commands.
- **Synthesis Process** (MANDATORY - follow in order):
- 1. Read the original user prompt (provided in the context)
- 2. Review each councillor's response individually - note each councillor's \
- key insight and unique contribution by name
- 3. Identify agreements and contradictions between councillors
- 4. Resolve contradictions with explicit reasoning
- 5. Synthesize the optimal final answer
- 6. Format output per the Required Output Format below
- **Behavior**:
- - Credit specific insights from individual councillors using their names
- - If councillors disagree, explain why you chose one approach over another
- - Be transparent about trade-offs when different approaches have valid pros/cons
- - Do not omit per-councillor details from the final response
- - Do not collapse the output into only a final summary - keep the per-councillor and summary sections distinct
- - Don't just average responses - choose the best approach and improve upon it
- **Required Output Format**:
- Always include these sections in your final response:
- ## Council Response
- Provide the best synthesized answer. Integrate the strongest points from the \
- councillors, resolve disagreements, and give the user a clear final \
- recommendation or answer. Include relevant code examples and concrete details.
- ## Per-Councillor Details
- For each councillor, show:
- - Their key insight, idea, or recommendation (using their exact name - the seat name, e.g. "alpha", not the model label)
- - Their confidence level (if expressed)
- - Notable points of agreement/disagreement with other councillors
- - If a councillor failed or timed out, note that status briefly instead of omitting it
- ## Council Summary
- - **Consensus Level**: unanimous | majority | split (pick one)
- - **Agreed Points**: what all councillors agreed on
- - **Disagreements**: where councillors differed and your resolution
- - **Remaining Uncertainty**: any caveats, untested assumptions, or open questions the council could not fully resolve
- - **Recommended Action**: what to do next`;
- /**
- * Create the council agent definition.
- * The council agent synthesizes councillor responses into a structured report.
- * It does not dispatch councillors — the orchestrator handles that.
- */
- export function createCouncilAgent(
- model: string,
- customPrompt?: string,
- customAppendPrompt?: string,
- ): AgentDefinition {
- const prompt =
- resolvePrompt(COUNCIL_AGENT_PROMPT, customPrompt, customAppendPrompt) +
- COUNCIL_SYNTHESIS_REINFORCEMENT;
- return {
- name: 'council',
- description:
- 'Multi-model consensus agent that synthesizes viewpoints from council members to make informed decisions with higher confidence than single models',
- config: {
- model,
- temperature: 0.1,
- prompt,
- permission: {
- ...createSynthesisOnlyPermission(),
- },
- },
- };
- }
|