多代理圆桌讨论工具

Agora是一个多代理圆桌讨论工具,支持通过CLI和MCP服务器集成进行多模型AI代理的并行讨论与综合答案生成。

  • by lagameon
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 lagameon/agora

使用说明

广场

多代理圆桌讨论工具。发布一个问题,多个AI代理从不同的角度进行讨论,合成器会产生最终答案。

作为一个 CLI工具 作为一个 MCP服务器 用于Claude Code集成。

特性

  • 多代理讨论 --具有不同角色和模型的可配置AI代理面板
  • 多供应商 --Anthropic、OpenAI、谷歌双子座、DeepSeek、xAI/Grok、Ollama(本地)
  • YAML预设 --使用定义自定义代理面板 {{topic}} 模板插值
  • 同期第一轮 --所有小组成员并行响应,快约50%
  • 快速缓存 --人类学 cache_control 缓存令牌的成本降低了约90%
  • 讨论历史 --SQLite持久化 bun:sqlite,可查询和可回放
  • MCP服务器 --与Claude Code集成,用于按需AI圆桌会议
  • 流输出 --实时流媒体彩色编码终端渲染

快速开始

先决条件

  • 包子 运行时(v1.0+)
  • 至少一个LLM API密钥

安装

git clone https://github.com/lagameon/agora.git
cd agora
bun install

配置API密钥

创建一个 .env 项目根目录中的文件:

cp .env.example .env
# Edit .env with your API keys
# At least one required
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GOOGLE_API_KEY=AI...

# Optional
DEEPSEEK_API_KEY=sk-...
XAI_API_KEY=xai-...
OLLAMA_BASE_URL=http://localhost:11434/v1

注: 默认预设使用 gpt-4.1-mini --set OPENAI_API_KEY 快速开始。这 research 预设使用Claude+GPT+Gemini,需要所有三个密钥。

跑

# Quick single-model query
bun run src/cli.ts ask "What is quantitative trading?"

# Roundtable discussion (default preset: 3 agents)
bun run src/cli.ts discuss "React vs Vue in 2026?"

# Use a specific preset
bun run src/cli.ts discuss "Should AI replace most programming jobs?" --preset debate

CLI命令

agora ask <question> [--model <model>]     Quick single-model query
agora discuss <topic> [options]             Run a roundtable discussion
agora presets                               List available presets
agora history [--id <id>]                   View discussion history
agora mcp                                   Start MCP server (stdio)

选项

标志 描述 默认值
--model <model> 型号 ask 命令 gpt-4.1-mini
--preset <name> 预设为 discuss 命令 default
--rounds <n> 最多讨论轮次 2

例子

# Ask with a specific model
bun run src/cli.ts ask "Explain transformers" --model claude-sonnet-4-5

# Research panel (Claude + GPT + Gemini)
bun run src/cli.ts discuss "Will the US dollar lose reserve currency status?" --preset research

# Adversarial debate with 3 rounds
bun run src/cli.ts discuss "Cryptocurrency is the future of money" --preset debate --rounds 3

# View discussion history
bun run src/cli.ts history
bun run src/cli.ts history --id <discussion_id>

内置预设

预设 描述 代理 型号
默认 平衡三代理面板 分析师+评论家+合成器 gpt-4.1-mini
研究 深度研究小组 领域专家+方法论专家+反向器+合成器 克劳德十四行诗+GPT-4.1+双子座闪电侠
辩论 对抗性辩论 支持者+对手+裁判 GPT-4.1+克劳德·索内特

自定义预设

预设从三个目录加载(最高优先级优先):

优先级 目录 范围
1 ./.agora/presets/ 项目本地(每个回购)
2 ~/.agora/presets/ 用户全局(共享)
3 <agora>/presets/ 内置

相同名称的预设被更高的优先级遮挡。这允许每个项目覆盖全局默认值。

在中创建YAML文件 ~/.agora/presets/ (全球)或 .agora/presets/ 在项目根目录(项目本地)中:

name: "My Team"
description: "Custom panel for technical decisions"
maxRounds: 2

agents:
  - id: architect
    name: "The Architect"
    role: panelist
    model: claude-sonnet-4-5
    systemPrompt: |
      You are a software architect evaluating: {{topic}}.
      Focus on system design, scalability, and long-term maintainability.
    temperature: 0.6
    maxTokens: 1024

  - id: pragmatist
    name: "The Pragmatist"
    role: panelist
    model: gpt-4.1
    systemPrompt: |
      You are a pragmatic engineer evaluating: {{topic}}.
      Focus on implementation complexity, developer experience, and time-to-ship.
    temperature: 0.7
    maxTokens: 1024

  - id: synthesizer
    name: "Decision Maker"
    role: synthesizer
    model: claude-sonnet-4-5
    systemPrompt: |
      Synthesize the discussion about: {{topic}}.
      Weigh all perspectives and produce an actionable recommendation.
    temperature: 0.3
    maxTokens: 2048

另存为 ~/.agora/presets/my-team.yaml那么:

bun run src/cli.ts discuss "Should we migrate to microservices?" --preset my-team

预设架构

字段 类型 必填 描述
name string 否 显示名称
description string 否 描述
maxRounds number No 最大讨论轮次(默认:2,最大:10)
agents array 是 至少2个代理,其中一个必须是 synthesizer

代理架构

字段 类型 必填 描述
id string 是 唯一标识符
name string 是 显示名称
role string 是 panelist, moderator,或 synthesizer
model string 是 型号标识符(请参阅支持的型号)
systemPrompt string 是 系统提示,支持 {{topic}}
temperature number 否 0-2(默认值:0.7)
maxTokens number No 最大响应令牌(默认值:1024)

支持的型号

前缀 提供者 示例
claude-* 人类学 claude-sonnet-4-5, claude-haiku-4-5
gpt-* OpenAI gpt-4.1, gpt-4.1-mini
o1-* / o3-* / o4-* OpenAI o3-mini, o4-mini
gemini-* 谷歌 gemini-2.5-flash, gemini-2.5-pro
deepseek-* DeepSeek deepseek-chat, deepseek-reasoner
grok-* xAI grok-3
ollama:* Ollama(当地) ollama:llama3, ollama:mistral

MCP服务器(克劳德代码集成)

Agora可以作为MCP服务器运行,允许Claude Code按需调用AI圆桌会议。

配置

添加到您的项目 .mcp.json (或 ~/.claude/mcp.json 全球访问):

{
  "mcpServers": {
    "agora": {
      "command": "bun",
      "args": ["run", "/path/to/agora/src/mcp.ts"]
    }
  }
}

API密钥应在shell环境中设置,或通过 env 现场。

MCP工具

工具 说明
agora_discuss(topic, preset?, maxRounds?) 进行圆桌讨论
agora_ask(question, model?) 快速单模型查询

MCP资源

URI 描述
agora://presets 列出所有可用的预设
agora://history 最近讨论列表
agora://discussions/{id} 完整讨论记录

Claude代码中的用法

自然地问克劳德:

  • “使用agora讨论React与Vue”
  • “举办一个关于量子计算未来的集市研究小组”
  • “请问agora:什么是MCP协议?”

建筑

Question ──→ Round 1 (concurrent): All panelists respond in parallel
               │
               ▼
             Round 2+ (sequential): Each agent sees all prior responses
               │
               ▼
             Synthesizer: Produces final answer from full discussion
               │
               ▼
             SQLite: Discussion saved automatically

关键设计决策

  • 无郎链 --直接SDK调用,实现对提示缓存和流媒体的完全控制
  • 异步发电机发动机 --CLI、MCP服务器和历史存储都使用相同类型的事件流
  • 提供商前缀路由 --模型名称前缀决定使用哪个SDK
  • 拟人提示缓存 — cache_control 系统提示和累积上下文上的标题可降低约90%的成本
  • 第一轮同时进行 — Promise.allSettled 并行解雇所有小组成员(无需事先了解背景),速度提高约50%
  • 面包:sqlite --零依赖持久性(内置于Bun中),两个表: discussions 和 messages

项目结构

agora/
├── src/
│   ├── cli.ts                    # CLI entry point
│   ├── index.ts                  # Library public API
│   ├── mcp.ts                    # MCP server (stdio transport)
│   ├── config/
│   │   ├── schema.ts             # Zod schemas for validation
│   │   ├── loader.ts             # YAML preset loader
│   │   └── defaults.ts           # Default settings
│   ├── providers/
│   │   ├── router.ts             # Model prefix → provider factory
│   │   ├── types.ts              # ChatProvider interface
│   │   └── retry.ts              # Exponential backoff
│   ├── agents/
│   │   ├── types.ts              # Agent types
│   │   └── presets.ts            # Built-in default preset
│   ├── roundtable/
│   │   ├── engine.ts             # Core discussion engine
│   │   ├── protocol.ts           # Round logic & concurrency
│   │   ├── context.ts            # Message building + prompt caching
│   │   └── types.ts              # Event types
│   ├── history/
│   │   └── store.ts              # bun:sqlite persistence
│   └── output/
│       └── terminal.ts           # Color-coded terminal renderer
└── presets/
    ├── default.yaml              # Balanced 3-agent panel
    ├── research.yaml             # Deep research panel
    └── debate.yaml               # Adversarial debate

程序化API

Agora可以用作图书馆:

import { runRoundtable, loadPreset, interpolateConfig } from 'agora';

const topic = "Should we use GraphQL or REST?";
const config = interpolateConfig(loadPreset('default'), topic);

for await (const event of runRoundtable(topic, config)) {
  if (event.type === 'agent_done') {
    console.log(`${event.agentName}: ${event.fullResponse}`);
  }
  if (event.type === 'synthesis_done') {
    console.log(`Final answer: ${event.answer}`);
  }
}

数据存储

讨论历史记录存储在 ~/.agora/agora.db (SQLite)。此目录在首次运行时自动创建。

  • 讨论可通过以下方式查询 agora history
  • 完整成绩单可通过 agora history --id <id>
  • 数据库仅在本地,从不传输到任何地方

许可证

麻省理工学院