This page describes code and deployment configuration, not a record of successful provider runs. Runtime evidence belongs on Status. The deployment supplies no provider credentials and leaves DEFAULT_MODEL empty; browser-driven provider features therefore use the visitor’s configuration. Sources: deploy/maic.env.example, lib/utils/model-config.ts:6-21, lib/server/resolve-model.ts:30-54.

How to read the matrix

  • configured means the implementation is present and its entry point is available, not that a browser, remote endpoint, or provider has been tested.
  • credential-dependent means the provider-backed operation requires the visitor’s own usable key in this deployment.
  • blocked means the specified operation cannot work here; its row or accompanying text gives the reason.

“Requires credential” below concerns provider credentials, not access to the site. The entire app vhost, including assets and /api/, has a server-level HTTP Basic gate over TLS; nginx removes that gate’s Authorization header before proxying. Source: deploy/nginx/maic.loca.zone.conf. Visitor provider keys instead persist in browser settings-storage and travel in application requests through the server. Sources: lib/store/settings.ts:944-946, app/generation-preview/page.tsx:91-116.

Prompt and PDF to classroom

The browser creates a generation session, requests an outline, generates scene content and actions, then saves the classroom locally. These are separate operations, not one offline browser model. Sources: app/page.tsx:233-297, app/generation-preview/page.tsx:472-488, app/generation-preview/page.tsx:595-647, lib/store/stage.ts:249-264.

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Enter requirements and attach a PDFBrowser form and generation sessionNo provider key to edit the formconfiguredapp/page.tsx:233-297; components/generation/generation-toolbar.tsx:99-107
Prompt and parsed PDF to scene outlinesServer LLM call; browser consumes /api/generate/scene-outlines-stream SSEVisitor LLM keycredential-dependentapp/generation-preview/page.tsx:472-488; app/api/generate/scene-outlines-stream/route.ts:99-117,248-255,350-355
Outline to scene contentServer through /api/generate/scene-contentVisitor LLM keycredential-dependentapp/generation-preview/page.tsx:595-617; app/api/generate/scene-content/route.ts:26-74,139-162
Scene content to playback actionsServer through /api/generate/scene-actionsVisitor LLM keycredential-dependentapp/generation-preview/page.tsx:623-647; app/api/generate/scene-actions/route.ts:34-78,128-153
Generate remaining scenes after entering the classroomBrowser orchestrates the same server content/actions endpointsVisitor LLM keycredential-dependentlib/hooks/use-scene-generator.ts:33-118; app/classroom/[id]/page.tsx:103-138
Save an authored classroom for this browserBrowser IndexedDBNo provider key for the save itselfconfiguredlib/store/stage.ts:249-264; lib/utils/stage-storage.ts:36-71

A prompt is still required: attaching a PDF alone does not enable generation, and a missing model selection opens setup rather than starting the pipeline. Selecting a model is not proof that its key is valid. Sources: app/page.tsx:233-248, app/page.tsx:316-322, app/page.tsx:577-589.

Opening an unfinished classroom can automatically resume generation; opening a classroom whose scenes are complete can resume missing media work. Do not treat every classroom visit as a passive read. Source: app/classroom/[id]/page.tsx:103-149.

PDF parsing

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Local unpdf text and image extraction, the default parserApp server through /api/parse-pdf; not browser-onlyNo provider keyconfiguredlib/store/settings.ts:276-282; lib/pdf/constants.ts:12-18; lib/pdf/pdf-providers.ts:170-172,194-205
Remote MinerU adapter with a visitor-supplied endpointApp server sends the PDF to the chosen service’s /file_parseEndpoint URL required; key only if that service requires oneconfiguredlib/pdf/constants.ts:20-25; lib/pdf/pdf-providers.ts:280-285,314-325

For MinerU, configured describes the reachable adapter, not a bundled running MinerU service. The Compose overlay defines only the maic application, and the parser throws if no MinerU base URL is supplied. Sources: deploy/compose.yml, lib/pdf/pdf-providers.ts:280-285.

Both parsers receive uploaded bytes through the application server. The edge caps request bodies at 32m; this is separate from downstream prompt truncation. Sources: app/api/parse-pdf/route.ts:23-55, deploy/nginx/maic.loca.zone.conf, lib/constants/generation.ts:6-10.

Classroom playback and assessment

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Render an existing slide classroomBrowser stage and slide rendererNo new LLM key for existing contentconfiguredcomponents/stage/scene-renderer.tsx:15-31; components/stage.tsx:248-264
Playback and action enginesBrowser PlaybackEngine and ActionEngineNo new LLM key for existing actionsconfiguredcomponents/stage.tsx:248-264; lib/playback/engine.ts:544-555
Execute existing whiteboard actions and use clear/history controlsBrowser action engine and whiteboard UINo provider keyconfiguredlib/action/engine.ts:274-305; components/whiteboard/index.tsx:37-64,110-143
Play existing narration or use text timingBrowser audio player/playback engineNo provider key for existing audio or reading timerconfiguredlib/utils/audio-player.ts:25-54; lib/playback/engine.ts:442-488
Grade objective choice questionsBrowser compares submitted and correct answer arraysNo provider keyconfiguredcomponents/scene-renderers/quiz-view.tsx:61-80
Grade short-answer questions with an LLMApp server through /api/quiz-gradeVisitor LLM keycredential-dependentcomponents/scene-renderers/quiz-view.tsx:82-120; app/api/quiz-grade/route.ts:28-38,58-90
Short-answer service-error fallbackBrowser assigns rounded half-credit after request failureNo working key needed to reach the fallback; this is not AI gradingconfiguredcomponents/scene-renderers/quiz-view.tsx:122-134

The fallback awards Math.round(points * 0.5) and displays a service-unavailable comment. It must not be interpreted as a successful assessment of the answer. Source: components/scene-renderers/quiz-view.tsx:122-134.

Existing content is distinct from new AI-authored content: whiteboard actions execute locally, while generation and live chat obtain new actions from provider-backed paths. Sources: lib/action/engine.ts:274-305, app/api/generate/scene-actions/route.ts:34-78, components/chat/use-chat-sessions.ts:400-414.

Interactive HTML and PBL

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Display existing interactive HTML or a scene URLBrowser iframe using srcDoc or srcNo LLM key for rendering; embedded content may contact other servicesconfiguredcomponents/scene-renderers/interactive-renderer.tsx:12-26
Generate interactive scene contentApp server scene-content generatorVisitor LLM keycredential-dependentapp/api/generate/scene-content/route.ts:139-162; components/stage/scene-renderer.tsx:24-26
Display an existing PBL project, select roles, and show its workspaceBrowser PBL rendererNo LLM key for existing project displayconfiguredcomponents/scene-renderers/pbl-renderer.tsx:39-64,108-126; components/scene-renderers/pbl/workspace.tsx:28-32,75-88
Generate PBL scene content through the browser workflowServer scene-content route supplies a language modelVisitor LLM keycredential-dependentapp/api/generate/scene-content/route.ts:139-147; lib/generation/scene-generator.ts:826-833
PBL agent replies and next-issue questionsApp server through /api/pbl/chatVisitor LLM keycredential-dependentcomponents/scene-renderers/pbl/use-pbl-chat.ts:58-88,187-223; app/api/pbl/chat/route.ts:25-35,58-69
Generate PBL scenes through the headless job pipelineServer runner omits the model required by the PBL branch and skips null contentA key alone would not fix this code pathblockedlib/server/classroom-generation.ts:323-335; lib/generation/scene-generator.ts:826-833

The interactive iframe’s exact sandbox flags are allow-scripts allow-same-origin allow-forms allow-popups. This is not a promise of inert or offline content. Source: components/scene-renderers/interactive-renderer.tsx:20-26.

The headless PBL limitation is separate from the browser PBL route: the latter passes the required language model, while the former does not. Sources: app/api/generate/scene-content/route.ts:139-147, lib/server/classroom-generation.ts:323-335, lib/generation/scene-generator.ts:826-833.

AI agents and discussion

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Select built-in teacher and classmate personasBrowser registry and agent controlsNo provider keyconfiguredcomponents/agent/agent-bar.tsx:14-32; lib/orchestration/registry/store.ts:43-67,203-230
Teacher/classmate chat and Q&ABrowser agent loop calls server /api/chatVisitor LLM keycredential-dependentcomponents/chat/use-chat-sessions.ts:400-414,879-890; app/api/chat/route.ts:45-100
Discussion and roundtable responsesStage discussion delegates to the chat loopVisitor LLM keycredential-dependentcomponents/stage.tsx:459-469; components/chat/use-chat-sessions.ts:1066-1081
Generate classroom-specific agent profilesServer /api/generate/agent-profiles, then browser persistenceVisitor LLM keycredential-dependentapp/generation-preview/page.tsx:376-439; app/api/generate/agent-profiles/route.ts:50-71,114-121

Automatic profile-generation errors fall back to preset agents; seeing agent avatars therefore does not demonstrate successful profile generation. Source: app/generation-preview/page.tsx:408-439. Missing chat model/key configuration stops the response path with setup feedback. Source: components/chat/use-chat-sessions.ts:879-890.

Image and video generation

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Seedream image generationServer image endpoint and Seedream adapterVisitor image-provider keycredential-dependentlib/media/image-providers.ts:17-28,93-95; app/api/generate/image/route.ts:30-77
Qwen Image generation, provider ID qwen-imageServer image endpoint and Qwen adapterVisitor image-provider keycredential-dependentlib/media/image-providers.ts:30-46,96-97; app/api/generate/image/route.ts:30-77
Nano Banana image generation, provider ID nano-bananaServer image endpoint and Gemini adapterVisitor image-provider keycredential-dependentlib/media/image-providers.ts:48-52,98-99; app/api/generate/image/route.ts:30-77
Seedance video generationServer video endpoint and Seedance adapterVisitor video-provider keycredential-dependentlib/media/video-providers.ts:17-38,145-147; app/api/generate/video/route.ts:31-82
Kling video generationServer video endpoint and Kling adapterVisitor video-provider keycredential-dependentlib/media/video-providers.ts:39-51,148-149; app/api/generate/video/route.ts:31-82
Veo video generationServer video endpoint and Veo adapterVisitor video-provider keycredential-dependentlib/media/video-providers.ts:52-68,150-151; app/api/generate/video/route.ts:31-82
Sora video generationRegistry entry exists, but dispatch has no Sora implementationA key cannot add the missing implementationblockedlib/media/video-providers.ts:69-76,145-154

Image/video requests use their own provider settings; an LLM key is not automatically an image/video configuration. The media orchestrator calls separate endpoints and downloads returned media through /api/proxy-media. Source: lib/media/media-orchestrator.ts:193-280.

Sora’s registry entry has an empty model list and falls into the unsupported-provider error. Do not count its presence in settings or environment-key documentation as a fourth implemented video backend. Source: lib/media/video-providers.ts:69-76,145-154.

Speech synthesis and recognition

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Native Web Speech TTS, the fresh-settings defaultBrowser and its available voicesNo OpenMAIC provider keyconfiguredlib/store/settings.ts:255-268; lib/audio/constants.ts:609-620
OpenAI cloud TTSApp server /api/generate/ttsVisitor TTS keycredential-dependentlib/audio/constants.ts:43-47; lib/audio/tts-providers.ts:120-122; lib/hooks/use-scene-generator.ts:123-156
Azure cloud TTSApp server /api/generate/ttsVisitor TTS key and concrete regional endpointcredential-dependentlib/audio/constants.ts:148-152; lib/audio/tts-providers.ts:124-125,186-206
GLM cloud TTSApp server /api/generate/ttsVisitor TTS keycredential-dependentlib/audio/constants.ts:191-195; lib/audio/tts-providers.ts:127-128,223-239
Qwen cloud TTSApp server /api/generate/ttsVisitor TTS keycredential-dependentlib/audio/constants.ts:252-256; lib/audio/tts-providers.ts:130-131,266-289
Native speech recognition, the fresh-settings ASR defaultBrowser SpeechRecognition implementationNo OpenMAIC provider key; browser support and permission requiredconfiguredlib/store/settings.ts:255-273; lib/audio/constants.ts:747-751; lib/hooks/use-audio-recorder.ts:43-76,93-124
OpenAI ASR, provider ID openai-whisperRecorded audio uploaded to server /api/transcriptionVisitor ASR keycredential-dependentlib/audio/constants.ts:631-635; lib/audio/asr-providers.ts:172-188; lib/hooks/use-audio-recorder.ts:128-168
Qwen ASR, provider ID qwen-asrRecorded audio uploaded to server /api/transcriptionVisitor ASR keycredential-dependentlib/audio/constants.ts:704-708; lib/audio/asr-providers.ts:199-224; lib/hooks/use-audio-recorder.ts:128-168

Browser-native audio is not a server synthesis/transcription service and is not an offline guarantee. The browser recorder handles support, permission, and network errors; server dispatch rejects native TTS/ASR providers. Sources: lib/hooks/use-audio-recorder.ts:43-76, lib/audio/tts-providers.ts:133-136, lib/audio/asr-providers.ts:244-292.

Web research

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Tavily research before outline generationApp server /api/web-search calls TavilyVisitor Tavily key; none supplied by this deploymentcredential-dependentlib/web-search/constants.ts:10-16; app/generation-preview/page.tsx:307-321; app/api/web-search/route.ts:15-45; deploy/maic.env.example

The toolbar disables search without a local key or server configuration. This enrichment is separate from the mandatory LLM generation path. Sources: components/generation/generation-toolbar.tsx:67-74,349-357, app/generation-preview/page.tsx:307-321,472-488.

Exports

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Download slide content as PPTXBrowser builds and downloads the presentationNo new provider-generation key; existing remote media may be fetchedconfiguredlib/export/use-export-pptx.ts:965-968,1082-1118
Download a resource ZIP with PPTX and existing interactive HTMLBrowser builds a ZIP; only interactive scenes with stored HTML are includedNo new provider-generation keyconfiguredlib/export/use-export-pptx.ts:1133-1164
Export classroom as PDFNo such export implementation in the routed export UINot a credential issueblockedcomponents/header.tsx:267-295; lib/export/use-export-pptx.ts:1180
Export classroom as video or MP4No such export implementation in the routed export UINot a credential issueblockedcomponents/header.tsx:267-295; lib/export/use-export-pptx.ts:1180

The menu waits for scenes, no pending or failed outlines, and settled media tasks; failed media tasks also count as settled. Both export actions additionally require at least one slide. Sources: components/header.tsx:50-54, lib/export/use-export-pptx.ts:1082-1088.

A resource ZIP is not a full classroom/database backup: it adds a PPTX and existing interactive HTML, not the full browser state, chats, settings, or generation metadata. Source: lib/export/use-export-pptx.ts:1133-1164.

Headless classroom API

CapabilityWhere it runsRequires credentialState in this deploymentEvidence (path:line)
Complete a headless POST /api/generate-classroom jobApp server deferred runnerServer LLM key and usable model configuration; browser BYOK is not consumed hereblockeddeploy/maic.env.example; lib/server/classroom-generation.ts:178-189; lib/server/resolve-model.ts:30; lib/ai/providers.ts:945-947
Submit a job and poll its recorded stateApp server routes and filesystem job storeSite gate access; submission is not generation successconfiguredapp/api/generate-classroom/route.ts:34-50; app/api/generate-classroom/[jobId]/route.ts:11-38

A valid submission can receive 202 and a jobId before the deferred runner fails. The runner resolves only server configuration, selecting implicit OpenAI gpt-4o-mini when DEFAULT_MODEL is empty; constructing that model throws without an OpenAI key. Sources: app/api/generate-classroom/route.ts:34-50, lib/server/classroom-generation.ts:178, lib/server/resolve-model.ts:30-54, lib/ai/providers.ts:945-947.

Known limitations in the pinned code

These headless limitations remain relevant to any later server-key enablement; the current deployment is already blocked before their generation phases. Sources: deploy/maic.env.example, lib/server/classroom-generation.ts:178-189.

  • PDF images ignored by headless generation. pdfContent.images is accepted, but only text reaches outline generation and the headless aiCall ignores its _images argument. Sources: lib/server/classroom-generation.ts:34-42,191-211,264-275.
  • PBL scenes skipped headlessly. The runner does not supply the model needed by the PBL branch; null scene content is skipped rather than persisted. Sources: lib/server/classroom-generation.ts:323-335, lib/generation/scene-generator.ts:826-833.
  • Success does not guarantee complete media. Headless media and TTS failures are logged and swallowed before classroom persistence, so a succeeded job may lack requested images, video, or audio. Sources: lib/server/classroom-generation.ts:365-417, lib/server/classroom-job-runner.ts:34-41.
  • Jobs are process-local execution, not a durable queue. Restart loses in-flight promises; saved job summaries do not restart them. Polling reports a running job as stale/failed after 30 minutes without an update, computed on read rather than written back; queued jobs do not get that timeout. Sources: lib/server/classroom-job-runner.ts:11-49, lib/server/classroom-job-store.ts:78-96,124-130.
  • Qwen TTS file suffix mismatch. Headless audio filenames use the first registry format, MP3 for Qwen, although the synthesis result reports WAV; the returned format is not used for the suffix. Sources: lib/server/classroom-media-generation.ts:227-250, lib/audio/constants.ts:606, lib/audio/tts-providers.ts:311-316.
  • Health flags are configuration presence only. /api/health checks provider-map lengths; its booleans do not test credentials, connectivity, generation quality, or storage writability. Source: app/api/health/route.ts:11-20.
  • Quickstart for the visitor configuration path.
  • Architecture for request flow and the two storage domains.
  • Security for gate and untrusted-input boundaries.
  • Status for the separate runtime evidence record.