Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,18 @@ FROM base AS builder

ARG NEXT_PUBLIC_PERSISTENCE
ARG NEXT_PUBLIC_PERSISTENCE_TOKEN
ARG NEXT_PUBLIC_MAIC_EDITOR_ENABLED
ARG NEXT_PUBLIC_PI_CHAT_ENABLED
ARG NEXT_PUBLIC_SHOW_VOCATIONAL_TEST_UI
ARG NEXT_PUBLIC_ENABLE_VIDEO_EXPORT
ARG NEXT_PUBLIC_ENABLE_PPTX_IMPORT
ENV NEXT_PUBLIC_PERSISTENCE=$NEXT_PUBLIC_PERSISTENCE
ENV NEXT_PUBLIC_PERSISTENCE_TOKEN=$NEXT_PUBLIC_PERSISTENCE_TOKEN
ENV NEXT_PUBLIC_MAIC_EDITOR_ENABLED=$NEXT_PUBLIC_MAIC_EDITOR_ENABLED
ENV NEXT_PUBLIC_PI_CHAT_ENABLED=$NEXT_PUBLIC_PI_CHAT_ENABLED
ENV NEXT_PUBLIC_SHOW_VOCATIONAL_TEST_UI=$NEXT_PUBLIC_SHOW_VOCATIONAL_TEST_UI
ENV NEXT_PUBLIC_ENABLE_VIDEO_EXPORT=$NEXT_PUBLIC_ENABLE_VIDEO_EXPORT
ENV NEXT_PUBLIC_ENABLE_PPTX_IMPORT=$NEXT_PUBLIC_ENABLE_PPTX_IMPORT

COPY --from=deps /app/node_modules ./node_modules
COPY --from=deps /app/packages ./packages
Expand Down
5 changes: 2 additions & 3 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
import { useDraftCache } from '@/lib/hooks/use-draft-cache';
import { SpeechButton } from '@/components/audio/speech-button';
import { useImportClassroom } from '@/lib/import/use-import-classroom';
import { shouldShowVocationalTestUi } from '@/lib/config/feature-flags';
import { isPptxImportEnabled, shouldShowVocationalTestUi } from '@/lib/config/feature-flags';
import { useImportPptx } from '@/lib/import/use-import-pptx';
import { InteractiveModeButton } from '@/components/generation/interactive-mode-button';

Expand All @@ -76,8 +76,7 @@
// PPTX import is still scaffolding: `useImportPptx` has no `onImported` consumer
// yet, so the flow only logs the parsed slides. Hide the entry point behind a
// flag until it's wired end-to-end, so the UI doesn't expose a no-op button.
// Enable with NEXT_PUBLIC_ENABLE_PPTX_IMPORT=true.
const PPTX_IMPORT_ENABLED = process.env.NEXT_PUBLIC_ENABLE_PPTX_IMPORT === 'true';
const PPTX_IMPORT_ENABLED = isPptxImportEnabled();

interface FormState {
courseMaterials: SelectedCourseMaterial[];
Expand Down Expand Up @@ -234,7 +233,7 @@
revokeThumbnailSlideMediaUrls(thumbnailsRef.current);
thumbnailsRef.current = {};
};
}, []);

Check warning on line 236 in app/page.tsx

View workflow job for this annotation

GitHub Actions / Lint, Typecheck & Unit Tests

React Hook useEffect has a missing dependency: 'loadClassrooms'. Either include it or remove the dependency array

const handleDelete = (id: string, e: React.MouseEvent) => {
e.stopPropagation();
Expand Down
11 changes: 8 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@ services:
build:
context: .
args:
# NEXT_PUBLIC_* values are compiled into the browser bundle. Leave both
# empty for today's browser-only persistence; the persistence quickstart
# in README supplies them on the compose command line.
# NEXT_PUBLIC_* values are compiled into the browser bundle. Leave them
# empty unless the corresponding client feature is explicitly enabled;
# persistence and other build-time flags can be supplied on the command line.
- NEXT_PUBLIC_PERSISTENCE=${NEXT_PUBLIC_PERSISTENCE:-}
- NEXT_PUBLIC_PERSISTENCE_TOKEN=${NEXT_PUBLIC_PERSISTENCE_TOKEN:-}
- NEXT_PUBLIC_MAIC_EDITOR_ENABLED=${NEXT_PUBLIC_MAIC_EDITOR_ENABLED:-}
- NEXT_PUBLIC_PI_CHAT_ENABLED=${NEXT_PUBLIC_PI_CHAT_ENABLED:-}
- NEXT_PUBLIC_SHOW_VOCATIONAL_TEST_UI=${NEXT_PUBLIC_SHOW_VOCATIONAL_TEST_UI:-}
- NEXT_PUBLIC_ENABLE_VIDEO_EXPORT=${NEXT_PUBLIC_ENABLE_VIDEO_EXPORT:-}
- NEXT_PUBLIC_ENABLE_PPTX_IMPORT=${NEXT_PUBLIC_ENABLE_PPTX_IMPORT:-}
ports:
- "3000:3000"
env_file:
Expand Down
5 changes: 5 additions & 0 deletions lib/config/feature-flags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,8 @@ export function shouldShowVocationalTestUi(): boolean {
export function isVideoExportEnabled(): boolean {
return readBoolean(process.env.NEXT_PUBLIC_ENABLE_VIDEO_EXPORT);
}

/** Experimental PPTX import entry point. Default OFF. */
export function isPptxImportEnabled(): boolean {
return readBoolean(process.env.NEXT_PUBLIC_ENABLE_PPTX_IMPORT);
}
23 changes: 23 additions & 0 deletions packages/docs/content/docs/configuration.ar.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,26 @@ web-search:
```

تتجاوز متغيرات البيئة حقول YAML المطابقة حقلا بحقل. ترتبط المفاتيح بمعرّفات provider مثل `openai` أو `doubao-tts` أو `openai-whisper` أو `mineru` أو `tavily` أو `minimax`.

## Providers إضافية وخيارات الخادم

يمكن إضافة custom OpenAI-compatible LLM provider من Settings. لا يمكن تسجيله عبر prefixes عشوائية لمتغيرات البيئة أو IDs غير معروفة في `server-providers.yml`. وتُضاف custom TTS/ASR providers أيضًا من إعدادات العميل.

يكتشف ComfyUI Image ملفات workflow من `public/` (مثل `comfyui-*.json` أو اسم يحتوي على `workflow`) ولا يحتاج إلى API key. عند تشغيل ComfyUI على المضيف مع Docker في الإنتاج، استخدم `host.docker.internal:8188` واضبط `ALLOW_LOCAL_NETWORKS=true`؛ وإلا سيرفض SSRF guard العنوان المحلي الذي يرسله العميل.

يعتمد تحليل المواد على parser المختار، وقد يشمل النصوص وPDF ومستندات Office والصور وبعض صيغ الصوت والفيديو. يدعم AliDocMind صيغ PDF وDOCX وPPTX وXLSX، والصور PNG وJPG/JPEG وBMP وGIF، والوسائط MP4 وMOV وAVI وMKV وWMV وMP3 وWAV وAAC.

تقبل feature flags القيمة `true` أو `1`، وتُعد القيم الأخرى معطلة. تُحقن متغيرات `NEXT_PUBLIC_*` وقت البناء؛ وفي Docker مررها كـ build args، بما في ذلك `NEXT_PUBLIC_ENABLE_PPTX_IMPORT` و`NEXT_PUBLIC_ENABLE_VIDEO_EXPORT`.

يستخدم Azure OpenAI المتغير `AZURE_OPENAI_API_KEY` وresource endpoint في `AZURE_OPENAI_BASE_URL` وأسماء deployment في `AZURE_OPENAI_MODELS`. Ollama وLemonade providers محليان ولا يحتاجان إلى API key. تعتمد إعدادات توليد الصور/الفيديو وTTS/ASR المخصص وتحليل المستندات/الوسائط وSearXNG و`DEFAULT_MODEL`/`MODEL_ROUTES` على إعدادات provider في `.env.example`؛ SearXNG مُدار من الخادم وBrave لا يحتاج إلى key.

خيارات خادم أخرى:

```bash
PARALLEL_SCENE_CONCURRENCY=3 # القيمة 0 أو عدم الإعداد: توليد تسلسلي
ALLOW_LOCAL_NETWORKS=true # للنشر الذاتي/الشبكات الداخلية فقط
RENDER_SERVICE_URL=http://render-service:9000
LOG_LEVEL=info
LOG_FORMAT=pretty
LLM_THINKING_DISABLED=false
```
23 changes: 23 additions & 0 deletions packages/docs/content/docs/configuration.ja.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,26 @@ web-search:
```

環境変数は対応する YAML フィールドをフィールド単位で上書きします。キーは `openai`、`doubao-tts`、`openai-whisper`、`mineru`、`tavily`、`minimax` のような provider ID に対応します。

## 追加 provider とサーバーオプション

カスタム OpenAI 互換 LLM provider は Settings から追加できます。任意の環境変数 prefix や未知の `server-providers.yml` ID から登録することはできません。カスタム TTS/ASR provider もクライアントの Settings に追加します。

ComfyUI Image は `public/` にある workflow(`comfyui-*.json`、または名前に `workflow` を含むファイル)を検出し、API key は不要です。Docker 本番環境でホストの ComfyUI (`host.docker.internal:8188`) に接続する場合は `ALLOW_LOCAL_NETWORKS=true` を設定してください。`comfyui-image` は server-managed provider ではないため、設定しないと SSRF 保護により拒否されます。

ドキュメント解析は parser に応じてテキスト、PDF、Office 文書、画像、一部の音声・動画形式をサポートします。AliDocMind は PDF、DOCX、PPTX、XLSX、PNG、JPG/JPEG、BMP、GIF、さらに MP4、MOV、AVI、MKV、WMV、MP3、WAV、AAC に対応します。

feature flag は `true` または `1` を受け付け、それ以外は無効です。`NEXT_PUBLIC_*` はビルド時の設定なので、Docker では `NEXT_PUBLIC_ENABLE_PPTX_IMPORT` や `NEXT_PUBLIC_ENABLE_VIDEO_EXPORT` などを build args で渡します。

Azure OpenAI は `AZURE_OPENAI_API_KEY`、リソース endpoint(`AZURE_OPENAI_BASE_URL`)、deployment name(`AZURE_OPENAI_MODELS`)を使用します。Ollama と Lemonade はローカル provider のため API key 不要です。画像/動画生成、カスタム TTS/ASR、ドキュメント/メディア解析、SearXNG、`DEFAULT_MODEL`/`MODEL_ROUTES` は `.env.example` の provider 別設定に従います。SearXNG は server-managed、Brave は keyless です。

その他のサーバーオプション:

```bash
PARALLEL_SCENE_CONCURRENCY=3 # 0 または未設定:逐次生成
ALLOW_LOCAL_NETWORKS=true # self-hosted/内部ネットワーク向け
RENDER_SERVICE_URL=http://render-service:9000
LOG_LEVEL=info
LOG_FORMAT=pretty
LLM_THINKING_DISABLED=false
```
23 changes: 23 additions & 0 deletions packages/docs/content/docs/configuration.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,26 @@ web-search:
```

Environment variables override matching YAML fields field-by-field. Keys map to provider IDs such as `openai`, `doubao-tts`, `openai-whisper`, `mineru`, `tavily`, or `minimax`.

## Additional providers and server options

Custom OpenAI-compatible LLM providers can be added in Settings. They are not registered through arbitrary environment-variable prefixes or unknown `server-providers.yml` IDs. Custom OpenAI-compatible TTS and ASR providers are also client-side Settings entries.

ComfyUI Image uses workflows discovered from `public/` (filenames such as `comfyui-*.json` or names containing `workflow`) and does not require an API key. For a host-side ComfyUI in production Docker, use `host.docker.internal:8188` and set `ALLOW_LOCAL_NETWORKS=true`; otherwise the SSRF guard rejects the client-supplied local URL.

Document parsing supports text, PDF, Office documents, images, and some audio/video formats depending on the parser. AliDocMind supports PDF, DOCX, PPTX, XLSX; PNG, JPG/JPEG, BMP, GIF; and (for media) MP4, MOV, AVI, MKV, WMV, MP3, WAV, and AAC.

Feature flags accept `true` or `1`; other values are off. `NEXT_PUBLIC_*` flags are build-time values. In Docker, pass them as build args, including `NEXT_PUBLIC_ENABLE_PPTX_IMPORT` and `NEXT_PUBLIC_ENABLE_VIDEO_EXPORT`.

Azure OpenAI uses `AZURE_OPENAI_API_KEY`, a resource endpoint in `AZURE_OPENAI_BASE_URL`, and deployment names in `AZURE_OPENAI_MODELS`. Ollama and Lemonade are local providers and do not need API keys. Image/video generation, custom TTS/ASR, document/media parsing, SearXNG, and `DEFAULT_MODEL`/`MODEL_ROUTES` use the same provider-specific settings described in `.env.example`; SearXNG is server-managed and Brave is keyless.

Other server options:

```bash
PARALLEL_SCENE_CONCURRENCY=3 # 0 or unset: serial generation
ALLOW_LOCAL_NETWORKS=true # self-hosted/internal deployments only
RENDER_SERVICE_URL=http://render-service:9000
LOG_LEVEL=info
LOG_FORMAT=pretty
LLM_THINKING_DISABLED=false
```
23 changes: 23 additions & 0 deletions packages/docs/content/docs/configuration.ru.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,26 @@ web-search:
```

Переменные окружения переопределяют совпадающие YAML fields по отдельным полям. Ключи соответствуют provider ID, например `openai`, `doubao-tts`, `openai-whisper`, `mineru`, `tavily` или `minimax`.

## Дополнительные provider и параметры сервера

Custom OpenAI-compatible LLM provider можно добавить в Settings. Произвольные prefixes переменных окружения и неизвестные ID в `server-providers.yml` для регистрации не поддерживаются. Custom OpenAI-compatible TTS и ASR provider также добавляются только в клиентских Settings.

ComfyUI Image обнаруживает workflow в `public/` (например, `comfyui-*.json` или имя с `workflow`) и не требует API key. В production Docker для ComfyUI на хосте используйте `host.docker.internal:8188` и задайте `ALLOW_LOCAL_NETWORKS=true`; иначе SSRF guard отклонит переданный клиентом локальный URL.

Разбор материалов зависит от parser и может включать текст, PDF, Office-документы, изображения и некоторые аудио/видео форматы. AliDocMind поддерживает PDF, DOCX, PPTX, XLSX; PNG, JPG/JPEG, BMP, GIF; а также MP4, MOV, AVI, MKV, WMV, MP3, WAV и AAC.

Feature flags принимают `true` или `1`, остальные значения выключают функцию. `NEXT_PUBLIC_*` задаются во время сборки; в Docker передавайте их как build args, включая `NEXT_PUBLIC_ENABLE_PPTX_IMPORT` и `NEXT_PUBLIC_ENABLE_VIDEO_EXPORT`.

Azure OpenAI использует `AZURE_OPENAI_API_KEY`, resource endpoint в `AZURE_OPENAI_BASE_URL` и deployment names в `AZURE_OPENAI_MODELS`. Ollama и Lemonade — локальные provider без API key. Настройки генерации изображений/видео, custom TTS/ASR, разбора документов и media, SearXNG, а также `DEFAULT_MODEL`/`MODEL_ROUTES` описаны в `.env.example`; SearXNG управляется сервером, Brave не требует key.

Другие параметры сервера:

```bash
PARALLEL_SCENE_CONCURRENCY=3 # 0 или unset: последовательная генерация
ALLOW_LOCAL_NETWORKS=true # только self-hosted/внутренние сети
RENDER_SERVICE_URL=http://render-service:9000
LOG_LEVEL=info
LOG_FORMAT=pretty
LLM_THINKING_DISABLED=false
```
Loading
Loading