🚀 快速安装
复制以下命令并运行,立即安装此 Skill:
npx skills add https://skills.sh/aradotso/trending-skills/openmaic-classroom
💡 提示:需要 Node.js 和 NPM
OpenMAIC — 多智能体互动教室
技能由 ara.so 提供 — Daily 2026 Skills 系列。
OpenMAIC(开放多智能体互动教室)是一个基于 Next.js 16 / React 19 / TypeScript 的平台,可将任何主题或文档转换为完整的互动课程。多智能体管道(LangGraph 1.1)生成幻灯片、测验、HTML 模拟和基于项目的学习活动,由 AI 教师和 AI 同学通过语音(文本转语音)和白板支持进行授课。
项目技术栈
| 层次 | 技术 |
|---|---|
| 框架 | Next.js 16 (App Router) |
| UI | React 19, Tailwind CSS 4 |
| 智能体编排 | LangGraph 1.1 |
| 语言 | TypeScript 5 |
| 包管理器 | pnpm >= 10 |
| 运行时 | Node.js >= 20 |
安装
git clone https://github.com/THU-MAIC/OpenMAIC.git
cd OpenMAIC
pnpm install
环境配置
cp .env.example .env.local
编辑 .env.local — 至少需要一个 LLM 提供商的密钥:
# LLM 提供商(至少配置一个)
OPENAI_API_KEY=$OPENAI_API_KEY
ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY
GOOGLE_API_KEY=$GOOGLE_API_KEY
# 推荐的默认模型(Gemini 3 Flash = 最佳速度/质量平衡)
DEFAULT_MODEL=google:gemini-3-flash-preview
# 可选:用于高级 PDF/表格/公式解析的 MinerU
PDF_MINERU_BASE_URL=https://mineru.net
PDF_MINERU_API_KEY=$MINERU_API_KEY
# 可选:托管模式的访问码
ACCESS_CODE=$OPENMAIC_ACCESS_CODE
通过 YAML 配置提供商(环境变量的替代方案)
在项目根目录创建 server-providers.yml:
providers:
openai:
apiKey: $OPENAI_API_KEY
anthropic:
apiKey: $ANTHROPIC_API_KEY
google:
apiKey: $GOOGLE_API_KEY
deepseek:
apiKey: $DEEPSEEK_API_KEY
# 任何 OpenAI 兼容的端点
custom:
baseURL: https://your-proxy.example.com/v1
apiKey: $CUSTOM_API_KEY
运行应用
# 开发模式
pnpm dev
# → http://localhost:3000
# 生产构建
pnpm build && pnpm start
# 类型检查
pnpm tsc --noEmit
# 代码检查
pnpm lint
Docker 部署
cp .env.example .env.local
# 使用您的 API 密钥编辑 .env.local
docker compose up --build
# → http://localhost:3000
Vercel 部署
# 复刻仓库,然后在 https://vercel.com/new 导入
# 在 Vercel 仪表板中设置环境变量:
# OPENAI_API_KEY 或 ANTHROPIC_API_KEY 或 GOOGLE_API_KEY
# DEFAULT_MODEL(可选,例如 google:gemini-3-flash-preview)
README 中提供了一键部署按钮,它会自动预填环境变量描述。
课程生成流程
OpenMAIC 使用两阶段流程:
| 阶段 | 描述 |
|---|---|
| 大纲 | AI 分析主题/文档并生成结构化的课程大纲 |
| 场景 | 每个大纲条目扩展为特定类型的场景:slides、quiz、interactive 或 pbl |
场景类型
| 类型 | 描述 |
|---|---|
slides |
AI 教师讲课,配有语音解说、聚光灯、激光笔 |
quiz |
单选/多选或简答题,带 AI 评分 |
interactive |
基于 HTML 的模拟(物理、流程图等) |
pbl |
项目式学习 — 选择角色,与智能体协作 |
API 使用 — 生成教室
REST:开始生成作业
// POST /api/generate
const response = await fetch('/api/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
topic: '量子纠缠',
// 可选:附加文档内容
document: markdownString,
// 可选:模型覆盖
model: 'google:gemini-3-flash-preview',
}),
});
const { jobId } = await response.json();
REST:轮询作业状态
// GET /api/generate/status?jobId=<jobId>
const poll = async (jobId: string) => {
while (true) {
const res = await fetch(`/api/generate/status?jobId=${jobId}`);
const data = await res.json();
if (data.status === 'completed') {
console.log('教室链接:', data.classroomUrl);
break;
}
if (data.status === 'failed') {
throw new Error(data.error);
}
// status === 'pending' | 'running'
await new Promise(r => setTimeout(r, 3000));
}
};
REST:导出幻灯片
// GET /api/export/pptx?classroomId=<id>
const exportPptx = async (classroomId: string) => {
const res = await fetch(`/api/export/pptx?classroomId=${classroomId}`);
const blob = await res.blob();
const url = URL.createObjectURL(blob);
// 触发下载
const a = document.createElement('a');
a.href = url;
a.download = 'lesson.pptx';
a.click();
};
// GET /api/export/html?classroomId=<id>
const exportHtml = async (classroomId: string) => {
const res = await fetch(`/api/export/html?classroomId=${classroomId}`);
const html = await res.text();
return html;
};
OpenClaw 集成
OpenMAIC 为 OpenClaw 提供了一个技能,支持从飞书、Slack、Discord、Telegram 等平台生成教室。
安装技能
# 通过 ClawHub 安装(推荐)
clawhub install openmaic
# 手动安装
mkdir -p ~/.openclaw/skills
cp -R /path/to/OpenMAIC/skills/openmaic ~/.openclaw/skills/openmaic
配置 OpenClaw
编辑 ~/.openclaw/openclaw.json:
{
"skills": {
"entries": {
"openmaic": {
"config": {
// 托管模式 — 从 https://open.maic.chat/ 获取访问码
"accessCode": "$OPENMAIC_ACCESS_CODE",
// 自托管模式 — 本地仓库 + 服务器 URL
"repoDir": "/path/to/OpenMAIC",
"url": "http://localhost:3000"
}
}
}
}
}
OpenClaw 技能生命周期
| 阶段 | 操作 |
|---|---|
| 克隆 | 检测现有检出或全新克隆 |
| 启动 | 选择 pnpm dev、pnpm build && pnpm start 或 Docker |
| 提供商密钥 | 引导用户编辑 .env.local |
| 生成 | 提交异步作业、轮询、返回教室链接 |
自定义场景开发模式
场景是类型化的 React 组件。要添加新的场景类型:
// types/scene.ts
export type SceneType = 'slides' | 'quiz' | 'interactive' | 'pbl' | 'custom';
export interface CustomScene {
type: 'custom';
title: string;
content: string;
// 您的字段
metadata: Record<string, unknown>;
}
// components/scenes/CustomScene.tsx
'use client';
import { type CustomScene } from '@/types/scene';
interface Props {
scene: CustomScene;
onComplete: () => void;
}
export function CustomSceneComponent({ scene, onComplete }: Props) {
return (
<div className="flex flex-col gap-4 p-6">
<h2 className="text-2xl font-bold">{scene.title}</h2>
<div dangerouslySetInnerHTML={{ __html: scene.content }} />
<button
className="mt-4 rounded-lg bg-blue-600 px-6 py-2 text-white"
onClick={onComplete}
>
继续
</button>
</div>
);
}
多智能体互动模式
| 模式 | 触发方式 | 描述 |
|---|---|---|
| 课堂讨论 | 自动 | 智能体主动发起讨论;用户可以加入或被点名 |
| 圆桌辩论 | 场景配置 | 多个智能体角色就某一话题进行辩论,并配有白板插图 |
| 问答 | 用户提问 | AI 教师使用幻灯片、图表或白板绘图进行回答 |
| 白板 | 任何场景中 | 智能体实时绘制方程、流程图或概念图 |
MinerU 高级文档解析
对于包含表格、公式或扫描图像的复杂 PDF:
# 使用 MinerU 托管 API
PDF_MINERU_BASE_URL=https://mineru.net
PDF_MINERU_API_KEY=$MINERU_API_KEY
# 或自托管 MinerU 实例(Docker)
PDF_MINERU_BASE_URL=http://localhost:8888
如果没有 MinerU,OpenMAIC 会回退到标准的 PDF 文本提取。
支持的 LLM 提供商及模型字符串
// 模型字符串格式:"provider:model-name"
const models = {
// Google(推荐)
geminiFlash: 'google:gemini-3-flash-preview', // 最佳速度/质量平衡
geminiPro: 'google:gemini-3.1-pro', // 最高质量
// OpenAI
gpt4o: 'openai:gpt-4o',
gpt4oMini: 'openai:gpt-4o-mini',
// Anthropic
claude4Sonnet: 'anthropic:claude-sonnet-4-5',
claude4Haiku: 'anthropic:claude-haiku-4-5',
// DeepSeek
deepseekChat: 'deepseek:deepseek-chat',
// OpenAI 兼容(自定义 base URL)
custom: 'custom:your-model-name',
};
导出格式
| 格式 | 端点 | 说明 |
|---|---|---|
PowerPoint .pptx |
GET /api/export/pptx?classroomId= |
完全可编辑的幻灯片 |
互动 .html |
GET /api/export/html?classroomId= |
独立的 HTML 页面 |
常见模式
从文档字符串生成教室
const generateFromDocument = async (markdownContent: string, topic: string) => {
const res = await fetch('/api/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
topic,
document: markdownContent,
model: process.env.DEFAULT_MODEL ?? 'google:gemini-3-flash-preview',
}),
});
const { jobId } = await res.json();
// 轮询直至完成
let classroomUrl: string | null = null;
while (!classroomUrl) {
await new Promise(r => setTimeout(r, 4000));
const status = await fetch(`/api/generate/status?jobId=${jobId}`).then(r => r.json());
if (status.status === 'completed') classroomUrl = status.classroomUrl;
if (status.status === 'failed') throw new Error(status.error);
}
return classroomUrl;
};
检查提供商健康状态
// GET /api/providers
const checkProviders = async () => {
const res = await fetch('/api/providers');
const { providers } = await res.json();
// providers: Array<{ name: string; available: boolean; models: string[] }>
return providers.filter((p: { available: boolean }) => p.available);
};
故障排除
| 问题 | 解决方案 |
|---|---|
未配置 LLM 提供商 |
在 .env.local 中至少设置 OPENAI_API_KEY、ANTHROPIC_API_KEY 或 GOOGLE_API_KEY 之一 |
| 生成在大纲阶段卡住 | 检查 API 密钥配额;尝试切换到 google:gemini-3-flash-preview 以获得更高的速率限制 |
| 文本转语音不起作用 | 文本转语音需要支持 Web Speech API 的浏览器;检查浏览器控制台错误 |
| PDF 解析产生乱码文本 | 通过在 .env.local 中设置 PDF_MINERU_BASE_URL 启用 MinerU |
| Vercel 生成超时 | 在 vercel.json 中增加函数超时时间;生成是异步的,因此 API 应立即返回 jobId |
| Docker 构建失败 | 确保 DOCKER_BUILDKIT=1 且在运行 docker compose up --build 之前存在 .env.local |
| 找不到 OpenClaw 技能 | 运行 clawhub install openmaic 或将 skills/openmaic 手动复制到 ~/.openclaw/skills/ |
Node < 20 时 pnpm install 失败 |
升级 Node.js 到 >= 20(nvm use 20) |
| 端口 3000 已被占用 | 在 .env.local 中设置 PORT=3001 或运行 PORT=3001 pnpm dev |
关键文件结构
OpenMAIC/
├── app/ # Next.js App Router 页面及 API 路由
│ ├── api/
│ │ ├── generate/ # POST 课程生成,GET 状态
│ │ ├── export/ # pptx / html 导出端点
│ │ └── providers/ # LLM 提供商健康检查
│ └── classroom/ # 教室查看页面
├── components/
│ ├── scenes/ # 幻灯片、测验、互动、PBL 组件
│ ├── whiteboard/ # 实时白板渲染
│ └── agents/ # 智能体头像及文本转语音组件
├── lib/
│ ├── agents/ # LangGraph 智能体图定义
│ ├── providers/ # LLM 提供商抽象
│ └── generation/ # 大纲 + 场景生成流程
├── skills/
│ └── openmaic/ # OpenClaw 技能定义
├── server-providers.yml # 可选的 YAML 提供商配置
├── .env.example # 环境变量模板
└── docker-compose.yml # Docker 部署配置
📄 原始文档
完整文档(英文):
https://skills.sh/aradotso/trending-skills/openmaic-classroom
💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)