한 문장으로 이 프로젝트가 뭘 하는지부터.
OpenMAIC = "프롬프트 한 줄을 넣으면, 슬라이드가 아니라 수업 한 시간이 나오는 플랫폼." 보통의 AI 슬라이드 도구(Gamma·Tome 류)는 결과물을 만든다 — 예쁜 장표 20장. OpenMAIC은 장표가 아니라 그 장표를 진행하는 '수업 시간' 자체를 만든다. 만들어진 교실에 들어가면 AI 선생님이 첫 장을 띄우고 말로 설명하며, 필요하면 칠판을 열어 수식을 쓰고 도표를 그린다. 옆자리 AI 급우가 "그 부분 잘 모르겠는데요"라고 끼어들고, 사람 학생도 아무 때나 손을 들 수 있다.
기존 AI 문서 도구는 인쇄소에 가깝다. 원고를 넣으면 잘 편집된 책이 나오고, 읽는 건 혼자 몫이다.
OpenMAIC은 강의실을 통째로 여는 쪽이다. 책도 찍고, 그 책으로 수업할 강사를 세우고, 질문할 동기까지 앉힌다. 그래서 산출물이 PDF가 아니라 재생 가능한 장면(scene)의 연속이다 — 누가 언제 무슨 말을 하고, 그때 칠판에 뭐가 그려지는지가 전부 데이터로 적혀 있다.
slide(장표) · quiz(문제) · interactive(직접 만져 보는 HTML) · pbl(프로젝트 과제). 이 네 글자가 DSL의 SceneType에 그대로 박혀 있다.@openmaic/dsl)을 만들어, 생성기·편집기·재생기·내보내기가 전부 같은 JSON 하나를 읽게 했다.규모부터 보면 취미 프로젝트가 아니다. TypeScript·TSX만 2,315개 파일 51만 3천 줄, API 라우트 69개, 자동 테스트 파일 807개(+ Playwright E2E 14개), 지원 언어 12개(한국어 포함), LLM·TTS·ASR·검색·이미지 프로바이더를 붙이는 환경변수만 122개다. 2026년 3월 v0.1.0으로 시작해 8월 27일 v1.0.0까지 다섯 달에 아홉 번 릴리스했다. 논문(JCST 2026)도 함께 있다.
별 2만 2천 개 — AI 슬라이드 도구가 넘쳐나는데 왜 이건 다른가.
2026년의 "AI로 자료 만들기"는 이미 레드오션이다. 그런데 OpenMAIC이 뜬 이유는 만드는 대상이 다르기 때문이다. 다섯 가지로 정리한다.
다른 도구의 출력은 장표다. OpenMAIC의 출력은 장면마다 붙은 행동 목록이다. 에이전트는 말만 하는 게 아니라 wb_draw_latex(칠판에 수식 쓰기)·wb_draw_chart(도표 그리기)·spotlight(한 요소만 남기고 흐리기)·wb_edit_code(코드 블록의 특정 줄만 고치기) 같은 21가지 행동을 지시한다. 그래서 결과물이 "읽는 것"이 아니라 "지켜보는 것"이 된다.
이게 이름의 'Multi-Agent'가 진짜로 하는 일이다. 교실에는 선생님 하나가 아니라 성격이 다른 AI 급우가 여럿 앉아 있고, 이들이 서로 질문하고 반박한다. 혼자 영상 강의를 볼 때 생기는 "질문할 사람이 없어서 그냥 넘어가는" 구간을 AI 급우가 대신 짚어 준다. 교육학에서 말하는 또래 학습(peer learning)을 소프트웨어로 흉내 낸 것이다.
README가 스스로를 neutral by design이라고 부른다. LLM은 OpenAI·Anthropic·Google·Bedrock·Azure·OpenRouter·DeepSeek·MiniMax·Grok·텐센트·샤오미에 Ollama와 Lemonade(로컬)까지, TTS는 OpenAI·Azure·MiniMax·Qwen에 VoxCPM2(로컬 음성 복제), ASR은 FunASR(로컬)까지 붙는다. 저장소도 파일·Postgres·S3 중에 고른다. "우리 모델을 쓰라"는 강제가 한 곳도 없다.
초기 버전은 "한 번 눌러 만들고 끝"이었다. v1.0.0에서 붙은 Pro 작업대는 채팅으로 커리큘럼을 짜고, 만든 페이지를 지목해 고치게 한다. 예를 들어 슬라이드의 요소 몇 개를 골라 "이것들 — 제목 좀 줄여 줘"라고 말할 수 있다(element-refs.ts가 그 참조를 다룬다). 작업 세션은 서버에 남아 브라우저를 닫거나 서버가 재시작해도 이어진다.
v0.3.0(2026-06-28)에서 AGPL-3.0 → MIT 재라이선스를 했다. AGPL은 "네트워크로 서비스하면 소스를 공개하라"는 조항 때문에 기업이 사내 도입을 주저하는 대표적 이유다. 이걸 MIT로 푼 것은 학교·기업이 자기 서비스에 얹는 길을 연 결정이고, 별이 붙는 속도에 직접 영향을 줬다고 보는 게 자연스럽다.
수업 하나를 만들 때 개요·씬 내용·행동·이미지·음성이 각각 별도의 모델 호출이다. 여기에 학생이 질문할 때마다 감독 에이전트 + 답변 에이전트가 한 번씩 더 돈다. 토큰 비용은 장표 생성 도구와 비교할 게 아니라 대화형 서비스 기준으로 잡아야 한다. 단계별로 모델을 다르게 지정하는 기능(per-stage model routing)이 v0.3.0에 들어간 것도 이 때문이다.
package.json 130개 의존성을 층별로 갈라 본다.
별도 백엔드 서버가 없다. Next.js App Router 하나가 화면과 API를 모두 맡고, API 라우트 69개가 app/api/ 아래에 있다. 그래서 Vercel 버튼 한 번으로 배포되는 구조가 성립한다.
| 영역 | 선택 | 왜 이걸 골랐나 |
|---|---|---|
| 프레임워크 | Next.js 16.1.2 · React 19.2.3 | 화면 + API를 한 배포 단위로. 서버 액션과 스트리밍 응답이 필요 |
| 언어 | TypeScript 5 | 수업 JSON(DSL)을 타입으로 강제 — 생성기가 만든 값이 재생기에서 깨지지 않게 |
| 스타일 | Tailwind CSS 4 · Radix UI · shadcn | 교실 UI 컴포넌트가 많아 조합형 프리미티브가 유리 |
| 상태 | Zustand 5 | 재생 중 씬·에이전트·칠판 상태를 전역으로 얕게 공유 |
| 애니메이션 | Motion 12 | 칠판 필기·스포트라이트 같은 연출 |
| 수식 | KaTeX | 에이전트가 wb_draw_latex로 쓴 수식을 즉시 렌더 |
여기가 설계에서 가장 흥미로운 지점이다. 보통 둘 중 하나만 쓰는데, OpenMAIC은 둘 다 쓴다.
| 패키지 | 버전 | 맡은 일 |
|---|---|---|
| ai (Vercel AI SDK) | ^6.0.168 | 모델 호출·스트리밍의 공통 창구. 프로바이더가 뭐든 여기로 통일 |
| @ai-sdk/openai · anthropic · google · azure · amazon-bedrock | 3.x~4.x | 프로바이더별 어댑터 |
| @langchain/langgraph | ^1.1.1 | 교실 진행을 상태 그래프로 — 누가 다음에 말할지 결정하는 감독 노드 |
| @langchain/core | ^1.1.16 | 메시지 타입·러너블 인터페이스 |
| zod | ^4.3.5 | 모델이 뱉은 JSON을 스키마로 검증 — 깨진 응답을 재생 전에 걸러 냄 |
둘을 잇는 접착제가 lib/orchestration/ai-sdk-adapter.ts(156줄)다. 파일 첫 주석이 목적을 그대로 밝힌다 — "LangGraph에 LangChain 호환 인터페이스를 제공하되, 실제 호출은 통합 callLLM/streamLLM 계층으로 내려보낸다." 덕분에 그래프는 LangGraph로 짜면서 모델 교체는 AI SDK의 프로바이더 목록으로 해결한다.
| 기능 | 도구 | 메모 |
|---|---|---|
| PPTX 내보내기 | pptxgenjs (워크스페이스 포크) | npm 버전이 아니라 레포 안에 포크해 넣은 패키지 |
| 수식 → Office | mathml2omml (워크스페이스 포크) | KaTeX MathML을 Word/PPT의 OMML로 변환 — 수식이 이미지가 아닌 편집 가능한 수식으로 나감 |
| PPTX 가져오기 | @openmaic/importer · pptxtojson | 기존 강의자료를 씬으로 역변환 |
| PDF·문서 파싱 | unpdf · pdf-lib · docx | 업로드한 자료에서 본문 추출 |
| 이미지 | sharp · @napi-rs/canvas | 서버 측 썸네일·합성 |
| 영상 내보내기 | @hyperframes/producer + 별도 컨테이너 | Chromium + FFmpeg가 필요해 앱과 분리된 render-service에서 실행 |
워크스페이스 포크가 무슨 뜻이냐면 — 남의 라이브러리를 npm install로 가져다 쓰는 대신 소스를 레포 안에 복사해 놓고 직접 손봐 쓰는 것이다. 셋집이 아니라 집을 사서 벽을 튼 셈이라, 원하는 대로 고칠 수 있지만 원본이 업데이트돼도 자동으로 따라오지 않는다. OpenMAIC은 PPT 출력 품질을 위해 그 대가를 치르기로 했다.
@openmaic/storage(v0.27.0)가 문서 / 런타임 / KV / 에셋 네 갈래를 각각 다른 백엔드로 붙일 수 있게 추상화한다. 기본은 로컬 파일, 프로덕션은 Postgres 16 + S3다. docker-compose.yml에서 postgres와 render-service는 프로파일로 분리돼 있어, 필요 없으면 앱 컨테이너 하나만 띄운다.
감독 그래프 · 행동 배열 · 지속 세션 — 세 가지 설계 결정.
교실에서 가장 어려운 문제는 발언권 배정이다. 선생님이 계속 말할지, 급우가 끼어들지, 학생 차례로 넘길지를 매 턴 정해야 한다. OpenMAIC은 이걸 LangGraph 상태 그래프로 짰다. lib/orchestration/director-graph.ts(548줄) 첫머리에 위상이 주석으로 그려져 있다.
주목할 점은 루프가 없다는 것이다. 한 요청은 감독 → 에이전트 한 사이클만 돈다. 여러 명이 이어서 토론하는 것처럼 보이는 건, 클라이언트가 요청을 여러 번 직렬로 보내기 때문이다. 소스 주석이 그 이유를 못 박는다 — "maxTurns 상한이 없다. 위상 자체가 상한이다."
멀티에이전트에서 흔한 사고가 에이전트끼리 끝없이 대화를 주고받는 것이다. 보통은 maxTurns = 10 같은 숫자로 막는데, 그 숫자는 언제든 잘못 설정될 수 있다. OpenMAIC은 그래프에서 돌아가는 간선을 아예 그리지 않았다. 한 번 돌면 무조건 END다. 제어를 클라이언트로 올려서, 사람이 창을 닫으면 그대로 멈춘다.
감독 노드는 에이전트 수에 따라 전략을 바꾼다. 혼자면 LLM을 아예 호출하지 않는다 — 첫 턴엔 그 에이전트를 부르고 이후엔 사용자에게 넘기는 코드 분기로 끝난다. 여럿일 때만 LLM이 다음 발언자를 고른다. 모델 호출 한 번이 곧 비용이라, 결정이 뻔한 경우를 코드로 빼는 최적화다.
보통 에이전트에 도구를 붙일 땐 function calling을 쓴다. OpenMAIC은 다르게 갔다. 모델에게 말과 행동이 섞인 배열 하나를 뱉게 한다.
[
{"type":"text","content":"자, 이 식의 좌변부터 볼까요."},
{"type":"action","name":"wb_open","params":{}},
{"type":"action","name":"wb_draw_latex",
"params":{"latex":"E = mc^2","x":120,"y":80}},
{"type":"text","content":"여기서 c는 빛의 속도입니다."},
{"type":"action","name":"spotlight","params":{"elementId":"eq-1"}}
]
이 방식의 이점이 분명하다. 말과 행동의 순서가 배열 순서로 그대로 보존된다. function calling은 "텍스트 한 덩어리 + 도구 호출 목록"으로 나뉘어서, 어느 문장 다음에 어느 그림이 나와야 하는지가 흐려진다. 수업은 타이밍이 전부인 매체라 이 차이가 크다. 파싱은 stateless-generate.ts(509줄)의 증분 파서가 맡아, 스트리밍 도중에도 완성된 항목부터 화면에 반영한다.
행동 어휘는 @openmaic/dsl의 action.ts에 21종으로 못 박혀 있다. 칠판 계열 12종(wb_open·wb_draw_text·wb_draw_shape·wb_draw_chart·wb_draw_latex·wb_draw_table·wb_draw_line·wb_draw_code·wb_edit_code·wb_clear·wb_delete·wb_close), 슬라이드 연출 2종(spotlight·laser), 위젯 조작 4종, 그리고 speech·play_video·discussion이다.
L1·L2 같은 안정적 ID가 붙어 있어서, "먼저 뼈대를 쓰고 → 설명하고 → 한 줄 추가하고 → 또 설명"하는 실제 강의 진행을 흉내 낼 수 있다. 코드를 통째로 다시 그리는 것과는 보는 느낌이 완전히 다르다.v1.0.0의 지속 세션이 여기다. 작업대의 대화는 브라우저 상태가 아니라 서버에 쌓이는 이벤트 로그이고, 브라우저는 /api/agent/sessions/:id/events로 그 로그를 접어 읽는다(lib/workbench/session-store.ts, 2,157줄 — 이 레포에서 가장 큰 단일 파일). 그래서 새로고침·재접속·서버 재시작을 넘어 작업이 이어지고, cancel 엔드포인트로 도중에 끊을 수도 있다.
흔한 채팅 UI는 화이트보드에 분필로 적는 것과 같다 — 창을 닫으면 지워진다. OpenMAIC의 세션은 회의록을 서버가 계속 받아 적는 방식이다. 내가 자리를 비웠다 돌아와도 회의록을 처음부터 다시 읽으면 지금 상태가 그대로 복원된다. 이벤트 로그(event sourcing)라 부르는 오래된 패턴인데, 에이전트 작업처럼 몇 분씩 걸리는 일에 특히 잘 맞는다.
MP4 내보내기는 Chromium을 띄워 화면을 캡처하고 FFmpeg로 인코딩해야 한다. 이걸 앱 프로세스 안에서 하면 메모리를 크게 먹고 앱 전체를 위험하게 만든다. OpenMAIC은 render-service를 별도 컨테이너로 떼고, 자원 프로파일을 두 개만 허용한다 — standard(8 GiB, BeginFrame 캡처)와 low-memory(4 GiB, 스크린샷 강제). 프로파일 한도를 넘는 동시성 값을 주면 조용히 무시하는 게 아니라 기동을 실패시킨다.
파일 2,822개 — 어디부터 열어야 하나.
| 파일 | 줄 | 왜 여기부터인가 |
|---|---|---|
| lib/orchestration/director-graph.ts | 548 | 교실 진행의 심장. 주석에 그래프 위상이 그림으로 그려져 있다 |
| lib/orchestration/stateless-generate.ts | 509 | 말+행동 JSON 배열을 스트리밍 중 증분 파싱하는 코드 |
| lib/orchestration/tool-schemas.ts | 72 | 21가지 행동의 설명문 — 프롬프트에 그대로 들어가는 문장들 |
| packages/@openmaic/dsl/src/stage.ts | — | 수업 데이터의 타입 정의. SceneType 네 글자가 여기 있다 |
| lib/workbench/session-store.ts | 2,157 | 서버 이벤트 로그를 브라우저 상태로 접는 방법 — 가장 큰 파일 |
파일 첫머리 주석이 유난히 길고 서술적이다. composer-skills.ts는 "한때 알약 모양 칩이었다"며 폐기한 UI 안까지 적어 두었고, run-courses.ts는 "단위는 한 번의 주고받기이지, 한 턴이 아니다"라고 개념을 못 박는다. 코드를 읽기 전에 head -12로 주석만 훑어도 설계 의도가 상당히 잡힌다.
skills/agent-runtime/ 아래 디렉터리마다 SKILL.md가 하나씩 있고, 앞머리에 name·title·description이 YAML로 붙는다. 교육학 방법론이 그대로 스킬 이름이 됐다 — understanding-by-design(백워드 설계)·spiral-curriculum(나선형 교육과정)·feynman-learning(파인만 기법)·social-emotional-learning·k12-core-literacy-planning. 여기에 제작 스킬(slide-craft·stage-design·pptx-import·page-clone)과 fact-check·deep-research가 붙는다.
README 52번째 줄은 20종이라고 쓴다. 그런데 ls -d skills/agent-runtime/*/로 세면 23개다(여기에 OpenClaw용 skills/openmaic/가 따로 하나 더 있다). 릴리스 후 스킬이 추가됐는데 README 숫자가 안 따라온 것으로 보인다. 이런 레포에서 개수·버전은 README가 아니라 소스 트리에서 세는 게 맞다.
이 레포를 읽어서 실제로 가져갈 수 있는 것들.
가장 크게 배울 대목이다. 에이전트를 여럿 굴리면 무한 대화·비용 폭주·순서 붕괴가 따라오는데, 흔한 대응은 상한 숫자를 거는 것이다. OpenMAIC은 그래프에서 돌아가는 간선을 지웠다. 제어를 한 층 위(클라이언트)로 올려 사람이 멈추면 멈추게 했다. 규칙을 설정값이 아니라 구조로 옮기면 잘못 설정될 여지 자체가 사라진다는 예시다.
도구 호출이 표준처럼 보이지만, 순서가 의미를 갖는 도메인에서는 "말과 행동이 섞인 배열"이 더 낫다. 대신 스트리밍 중 부분 JSON을 파싱해야 하는 부담이 생기고, 그 값을 치른 코드가 stateless-generate.ts에 있다. 두 방식의 트레이드오프를 실제 코드로 비교해 볼 수 있는 드문 자료다.
환경변수 122개가 지저분해 보이지만 규칙이 하나다 — {PROVIDER}_API_KEY / {PROVIDER}_BASE_URL / {PROVIDER}_MODELS. 이 세 쌍만 맞추면 새 프로바이더가 붙는다. OpenAI 호환 엔드포인트를 내놓는 서비스가 많아진 시대에 "어댑터를 늘리지 않고 설정으로 흡수하는" 전형적 해법이다. server-providers.yml로 같은 설정을 YAML로도 쓸 수 있다.
@openmaic/dsl의 설명문이 "순수하고 의존성 없는 계약"이다. 앱은 무거워도 규격은 가볍게 유지해서, 렌더러·편집기·가져오기·생성기가 서로를 모르고도 같은 JSON을 주고받는다. 버전이 각자 다른 것(dsl 0.11 / storage 0.27 / editor 0.0.4)도 신호다 — 안정된 것과 흔들리는 것을 분리했다는 뜻이다.
eval/에 평가 러너가 넷 있다 — orchestration(발언권 배정이 맞나) · pbl-v2-planner(과제 계획 품질) · whiteboard-layout(칠판 배치가 겹치지 않나) · outline-language(요청 언어대로 개요가 나오나). pnpm eval:whiteboard 한 줄로 돈다. "프롬프트를 고쳤을 때 좋아졌는지 어떻게 아나"에 대한 실물 답안이다.
BASE_URL을 넣을 수 있는 구조라 이 위험이 실재한다. 그래서 v0.3.1에 SSRF 방어를 넣었고, Ollama처럼 로컬 주소를 쓰는 프로바이더는 서버 측 환경변수로만 설정하게 해 우회 경로를 막았다.어디까지가 노트북에서 되고, 어디부터 서버가 필요한가.
| 용도 | 필요한 것 | 메모 |
|---|---|---|
| 기본 실행 | Node.js ≥ 20 · pnpm ≥ 10 | Docker 이미지는 node:22-alpine. GPU 불필요 |
| 모델 | LLM 프로바이더 키 최소 1개 | 전부 선택 사항이지만 하나는 있어야 생성이 돈다 |
| 영속성(선택) | PostgreSQL 16 | compose 프로파일로 분리 — 안 쓰면 로컬 파일 저장 |
| MP4 내보내기 | 별도 컨테이너 + 8 GiB | low-memory 프로파일은 4 GiB. GPU는 쓰지 않고 소프트웨어 렌더 |
| 음성·영상 추출 | 시스템 ffmpeg/ffprobe | npm 의존성이 아님 — PATH에 직접 설치해야 함 |
| 로컬 모델(선택) | Ollama 또는 Lemonade | Lemonade는 13305 포트의 OpenAI 호환 서버 |
| 로컬 ASR(선택) | FunASR (+ NVIDIA GPU면 vLLM) | WAV 입력 전용, API 키 불필요 |
정리하면 웹 앱 본체는 가볍다. GPU도, 대용량 메모리도 필요 없고 Vercel 버튼으로도 뜬다. 무거워지는 지점은 셋뿐이다 — 영상 렌더(8 GiB), 로컬 모델을 직접 돌릴 때, 그리고 토큰 비용. 앞의 둘은 안 쓰면 그만이지만 토큰 비용은 쓰는 만큼 계속 나가므로 이것만은 처음부터 계산에 넣어야 한다.
standard·low-memory 두 프로파일 모두 동시 렌더 1개, 워커 1개, 압축 해제 1개로 고정이다. 넘는 값을 주면 무시가 아니라 기동 실패다. 여러 명이 동시에 영상을 뽑으려면 설정을 올리는 게 아니라 컨테이너를 여러 개 띄워야 한다. 문서에도 "그 이상은 FIFO로 대기한다"고 적혀 있다.
읽기만 하면 안 남는다 — 난이도별 다섯 개.
API 키를 한 푼도 안 쓰고 돌려 본다. Ollama를 깔고 OLLAMA_BASE_URL·OLLAMA_MODELS만 채운 뒤 짧은 주제로 수업을 생성한다.
finalizeParser를 따라가 보자). 형식 준수가 모델 크기에 얼마나 민감한지가 이 실습의 진짜 수확이다.tool-schemas.ts의 getActionDescriptions에서 wb_draw_chart 설명을 빼고 같은 주제로 다시 생성한다.
skills/agent-runtime/에 새 폴더를 만들고 SKILL.md를 쓴다. 앞머리 name·title·description 형식은 기존 것을 그대로 따르되, 예컨대 "국내 수능 문제 유형으로 퀴즈 만들기" 같은 우리말 맥락을 넣어 본다.
curriculum-planner/SKILL.md가 좋은 본보기다. 이 스킬이 쓸 수 있는 도구를 명시적으로 열거하고, 그 밖의 일은 다른 스킬에 넘긴다고 못 박는 구조를 눈여겨볼 것.pnpm eval:whiteboard로 기준선을 잡고, 칠판 배치 프롬프트를 한 군데 고친 뒤 다시 돌려 점수를 비교한다.
eval/whiteboard-layout/)를 먼저 읽고 시작할 것.director-graph.ts에 fact_check 노드를 추가해, 에이전트가 말한 내용 중 숫자가 들어간 문장을 한 번 더 검증하게 만든다.
이 레포를 발판으로 4주.
| 주차 | 주제 | 할 일 |
|---|---|---|
| 1주차 | 돌려 보고 데이터 읽기 | 로컬 실행 → 수업 하나 생성 → 만들어진 스테이지 JSON을 열어 SceneType·행동 배열을 눈으로 확인. @openmaic/dsl의 타입 정의와 대조한다 |
| 2주차 | LangGraph 상태 그래프 | director-graph.ts를 줄 단위로 읽고 Annotation.Root로 상태를 정의하는 방식을 익힌다. 빈 프로젝트에 노드 2개짜리 그래프를 직접 짜 본다 |
| 3주차 | 스트리밍과 증분 파싱 | stateless-generate.ts의 파서를 따라가며 토큰이 쪼개져 도착할 때 JSON을 어떻게 부분 해석하는지 이해한다. SSE·config.writer()로 이벤트를 밀어내는 경로도 함께 |
| 4주차 | 평가와 프롬프트 개선 | eval/ 러너 구조를 읽고, 내 프로젝트용 평가 하네스를 하나 만든다. 프롬프트 변경 → 점수 비교 → 채택/폐기 루프를 실제로 한 바퀴 돌린다 |
여유가 있으면 이벤트 소싱을 따로 한 주 붙일 만하다. session-store.ts가 "서버 이벤트 로그를 클라이언트 상태로 접는" 방식의 실물 교재라, 에이전트를 오래 돌리는 제품을 만들 계획이라면 여기서 가장 크게 남는다.
이 문서에 나온 말들을 한 곳에.
| 용어 | 뜻 |
|---|---|
| Stage / Scene | 수업 한 편 / 그 안의 페이지 하나. 씬은 slide·quiz·interactive·pbl 네 종류 |
| Action | 에이전트가 화면에 지시하는 행동. 칠판·스포트라이트·위젯 등 21종 |
| Director (감독) | 다음에 누가 말할지 정하는 LangGraph 노드. 에이전트가 하나면 LLM을 안 부른다 |
| StateGraph | LangGraph의 핵심 개념. 노드와 간선으로 에이전트 흐름을 그린 상태 기계 |
| SSE (Server-Sent Events) | 서버가 클라이언트로 한 방향 스트림을 보내는 방식. 생성 진행 상황을 실시간으로 밀어낼 때 씀 |
| Durable session | 서버에 이벤트 로그로 남는 작업 세션. 새로고침·재시작을 넘어 이어진다 |
| PBL | Project-Based Learning. 강의 대신 과제를 주고 풀게 하는 수업 형식. v2에 교실 UI가 붙었다 |
| TTS / ASR | 글을 말로 바꾸기 / 말을 글로 바꾸기. 선생님 목소리와 음성·영상 자료 처리에 각각 쓰인다 |
| Voice cloning | 짧은 샘플로 특정 목소리를 흉내 내는 기술. VoxCPM2로 선생님 목소리를 지정할 수 있다 |
| OMML | Office Math Markup Language. 워드·PPT가 수식을 저장하는 형식. 이미지가 아니라 편집 가능한 수식으로 내보내려면 필요 |
| Monorepo | 여러 패키지를 한 저장소에서 관리하는 방식. 여기선 pnpm 워크스페이스로 @openmaic/* 6종을 함께 둔다 |
| SSRF | 서버가 대신 요청을 보내게 만들어 내부망을 노리는 공격. 사용자 지정 BASE_URL을 받는 구조의 대표 위험 |
| Resource profile | 렌더 서비스의 자원 등급. standard(8 GiB) / low-memory(4 GiB) 둘뿐이고 한도를 넘기면 기동 실패 |
| OpenClaw | 메신저에 붙는 개인 AI 비서. 이걸 통해 슬랙·텔레그램에서 바로 교실을 만들 수 있다 |
원문으로 더 깊이 — 공식 소스 위주.