# Ching Tech OS 應用程式設定 # 複製此檔案為 .env 並填入實際的值 # =================== # 資料庫設定 # =================== DB_HOST=localhost DB_PORT=5432 DB_USER=ching_tech DB_PASSWORD=your_db_password DB_NAME=ching_tech_os # =================== # NAS 設定 # =================== # 用於檔案管理、知識庫、專案附件等功能 NAS_HOST=192.168.11.50 NAS_PORT=445 NAS_USER=your_nas_user NAS_PASSWORD=your_nas_password NAS_SHARE=擎添開發 # NAS 掛載點路徑(由 install-service.sh 自動設定) # 掛載架構: # /mnt/nas/ctos → //NAS_HOST/擎添開發/ching-tech-os (讀寫) # /mnt/nas/projects → //NAS_HOST/擎添共用區/在案資料分享 (唯讀) # /mnt/nas/circuits → //NAS_HOST/擎添線路圖/圖檔 (唯讀) # /mnt/nas/library → //NAS_HOST/擎添圖書館 (讀寫) NAS_MOUNT_PATH=/mnt/nas CTOS_MOUNT_PATH=/mnt/nas/ctos PROJECTS_MOUNT_PATH=/mnt/nas/projects CIRCUITS_MOUNT_PATH=/mnt/nas/circuits LIBRARY_MOUNT_PATH=/mnt/nas/library # SMB 連線逾時(秒,預設 10) # SMB_CONNECT_TIMEOUT=10 # =================== # Line Bot 設定 # =================== # 從 Line Developers Console 取得 LINE_CHANNEL_SECRET=your_channel_secret LINE_CHANNEL_ACCESS_TOKEN=your_access_token # =================== # Telegram Bot 設定(可選) # =================== # 從 @BotFather 取得 TELEGRAM_BOT_TOKEN=your_telegram_bot_token # Webhook 驗證用 secret(自訂字串) TELEGRAM_WEBHOOK_SECRET=your_webhook_secret # 管理員 Telegram 用戶 ID(啟動時發送上線通知) TELEGRAM_ADMIN_CHAT_ID=your_admin_chat_id # Local Bot API Server(可選,突破 20MB 下載限制,支援 2GB) # 從 https://my.telegram.org 取得(免費,一個帳號一組,可多台共用) # TELEGRAM_API_ID=your_api_id # TELEGRAM_API_HASH=your_api_hash # 啟用後需在 docker compose 中啟動 telegram-bot-api 服務 # TELEGRAM_LOCAL_API_URL=http://localhost:8081 # TELEGRAM_LOCAL_API_DATA_DIR=/tmp/telegram-bot-api # =================== # Session 設定 # =================== # Session 有效時間(小時) SESSION_TTL_HOURS=8 # =================== # 路徑設定(可選,有預設值) # =================== # 前端靜態檔案目錄 FRONTEND_DIR=/home/ct/SDD/ching-tech-os/frontend # NAS 路徑(相對於 CTOS_MOUNT_PATH,由 property 組合為本機完整路徑) KNOWLEDGE_NAS_PATH=knowledge PROJECT_NAS_PATH=projects LINEBOT_NAS_PATH=linebot/files # 本機路徑 PROJECT_ATTACHMENTS_PATH=/home/ct/SDD/ching-tech-os/data/projects/attachments # =================== # Gemini 設定 # =================== # 申請網址:https://aistudio.google.com/app/apikey # 用於語音回覆(TTS)和長文翻譯(media-translation skill) GEMINI_API_KEY=your_gemini_api_key # =================== # AI Provider 路由(Codex 已接入;預設 forced Claude,canary/mode 由此控制) # =================== # claude(預設)| codex | auto;非法值會記錄錯誤並使用 claude # 已遷移 call_ai() 的入口:admin test-agent(context=test)、Web Chat(context=web-chat) # Codex 只會拿到唯讀工具(search_/get_/read_/list_/find_ 前綴);其餘入口固定 Claude AI_PROVIDER_MODE=claude # canary allowlist,exact match、逗號分隔;要對 admin test 入口做 canary 需加入 test AI_PROVIDER_CANARY_CONTEXTS=internal_admin,internal_test AI_PROVIDER_CANARY_AGENTS=test-agent # Per-context Codex 額外工具 allowlist(預設空 = 純唯讀 fail-closed) # 格式:context:mcp__server__tool|mcp__server__tool2,context2:... # 任一條目格式錯誤即整份作廢回唯讀預設;放行副作用工具前先確認有對應測試 # 範例:CODEX_CONTEXT_TOOL_ALLOWLIST=linebot-group:mcp__nanobanana__generate_image CODEX_CONTEXT_TOOL_ALLOWLIST= # auto mode:>=90% 切 Codex,低於 85% 才切回 Claude CLAUDE_USAGE_SWITCH_THRESHOLD=0.90 CLAUDE_USAGE_RECOVERY_THRESHOLD=0.85 # Router 只讀記憶體快照;背景每 60 秒刷新,最多沿用 300 秒舊資料 CLAUDE_USAGE_REFRESH_TTL_SECONDS=60 CLAUDE_USAGE_MAX_STALE_SECONDS=300 CLAUDE_USAGE_REFRESH_INTERVAL_SECONDS=60 CLAUDE_USAGE_HTTP_TIMEOUT_SECONDS=5 CLAUDE_USAGE_STARTUP_TIMEOUT_SECONDS=2 # 預設使用執行服務帳號的 ~/.claude/.credentials.json # CLAUDE_USAGE_CREDENTIALS_PATH=/home/ct/.claude/.credentials.json # Codex provider(pin 版 adapter/runtime 由根目錄 package.json + npm ci 安裝) # 預設使用 repo 內 node_modules/.bin 的 codex-acp 與 codex,通常不需覆寫 # CODEX_ACP_BIN_PATH=/path/to/node_modules/.bin/codex-acp # CODEX_BIN_PATH=/path/to/node_modules/.bin/codex # Codex auth storage:必須是 service user(ct)自己的 ~/.codex,不得用 root 的 # 部署前先以 service user 執行 codex login,再跑 preflight 驗證: # cd backend && uv run python -m ching_tech_os.services.codex_preflight # CODEX_HOME=/home/ct/.codex # =================== # Codex Image Service(自架,吃 ChatGPT 訂閱配額;設了就優先於 nanobanana) # =================== # Bearer key 從 codex-image-service admin 後台「Create API Key」取得(cimg_) # 純 text-to-image + image edit 都支援;失敗時自動退回 nanobanana / HF FLUX。 # 範例: # CODEX_IMAGE_BASE_URL=https://your-domain.example.com/codex-image # CODEX_IMAGE_API_KEY=cimg_xxxxxxxxxxxxxxxxxxxxxxxxx # CODEX_IMAGE_QUALITY=medium # low/medium/high/auto(影響速度與配額消耗) CODEX_IMAGE_BASE_URL= CODEX_IMAGE_API_KEY= CODEX_IMAGE_QUALITY=medium # 單回合 codex_image 工具最多呼叫次數(避免模型在同回合重複產圖;0 = 不限制) # CODEX_IMAGE_MAX_CALLS_PER_REQUEST=1 # =================== # Nanobanana 設定(AI 圖片生成,codex 不可用時的 fallback) # =================== NANOBANANA_GEMINI_API_KEY=your_gemini_api_key NANOBANANA_MODEL=gemini-3-pro-image-preview #NANOBANANA_MODEL=gemini-2.5-flash-image # 圖片輸出目錄(Line Bot 需要設定到 NAS 路徑讓後端可以存取) NANOBANANA_OUTPUT_DIR=/mnt/nas/ctos/linebot/files/ai-images # API 超時秒數(預設 60) NANOBANANA_TIMEOUT=180 # 單回合 nanobanana 工具最多呼叫次數(避免模型在同回合重複產圖;0 表示不限制) # NANOBANANA_MAX_CALLS_PER_REQUEST=1 # =================== # Hugging Face 設定(圖片生成備用服務) # =================== HUGGINGFACE_API_TOKEN=your_huggingface_api_token # =================== # Pexels API 設定(簡報配圖) # =================== PEXELS_API_KEY=your_pexels_api_key # =================== # Bot 設定 # =================== # 用於加密 bot_settings 資料庫中的憑證(留空則使用預設開發金鑰) # BOT_SECRET_KEY=your_secret_key # 未綁定用戶策略:reject(拒絕)| restricted(受限模式) BOT_UNBOUND_USER_POLICY=restricted # 受限模式使用的 AI 模型(預設 haiku) # BOT_RESTRICTED_MODEL=haiku # 預設受限 Agent ID(留空則使用系統預設) # BOT_DEFAULT_RESTRICTED_AGENT= # /debug 指令使用的模型(預設 sonnet) # BOT_DEBUG_MODEL=sonnet # 停用指令(逗號分隔,如 debug,agent) # BOT_CMD_DISABLED= # Intent Guard(意圖守門員)— 輕量前置過濾,用 Haiku 判斷用戶意圖 # 需要 ANTHROPIC_API_KEY(從 console.anthropic.com 取得) # 全域開關(預設關閉),Agent 級規則在 AI 管理介面的 settings.intent_guard 設定 # INTENT_GUARD_ENABLED=false # ANTHROPIC_API_KEY=sk-ant-api03-xxxxx # 頻率限制(受限模式適用) # BOT_RATE_LIMIT_ENABLED=false # BOT_RATE_LIMIT_HOURLY=10 # BOT_RATE_LIMIT_DAILY=50 # =================== # TTS 語音設定(可選) # =================== # Edge TTS 語音角色(完整列表: https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list) # 常用語音: # zh-TW-HsiaoChenNeural 台灣女聲(曉臻) # zh-TW-HsiaoYuNeural 台灣女聲(曉雨,較慢) # zh-TW-YunJheNeural 台灣男聲(雲哲) # zh-CN-XiaoxiaoNeural 中國女聲(曉曉) # zh-CN-YunyangNeural 中國男聲(雲揚) # zh-HK-HiuGaaiNeural 粵語女聲 # en-US-AriaNeural 英文女聲 # en-US-GuyNeural 英文男聲 # ja-JP-NanamiNeural 日文女聲 # ko-KR-SunHiNeural 韓文女聲 # TTS_VOICE=zh-TW-HsiaoChenNeural # =================== # Groq API(Whisper ASR,可選) # =================== # 提供 Groq API key 後,轉錄會優先使用 Groq Whisper large-v3 # 免費額度:每天 8 小時音訊,rate limit 時自動 fallback 本機 faster-whisper # GROQ_API_KEY=gsk_your_groq_api_key # =================== # 系統設定 # =================== # 公開 URL(用於分享連結、Webhook 等) PUBLIC_URL=https://ching-tech.ddns.net/ctos # 啟用模組清單(* = 全部啟用,逗號分隔指定模組) # 注意:core 永遠啟用(不需列入),skills 為必要模組 # ENABLED_MODULES=* # # 可用模組清單: # core - 核心功能(永遠啟用,不需列入) # knowledge-base - 知識庫 # file-manager - 檔案管理器 # ai-agent - AI Agent(Claude 對話) # line-bot - Line Bot 整合 # telegram-bot - Telegram Bot 整合 # public-share - 公開分享連結 / 檔案下載(Line Bot 圖片傳送需要此模組) # docs-tools - 文件工具(簡報/文件生成) # skills - Skills 系統(skill script 執行與前端資源載入) # terminal - Web 終端機 # code-editor - 程式碼編輯器 # task-scheduler - 任務排程 # his-integration - HIS 整合(需搭配 extends/his) # ct-his - 展望 HIS 叫號(需搭配 extends/his) # printer - 列印功能(需搭配 extends/printer) # erpnext - ERPNext ERP 整合(需搭配 extends/erpnext;已由往來與物料模組取代,停用後移除) # voice - 語音模組(TTS/STT,需搭配 extends/voice,需 uv sync --extra voice) # ct-law - 律師事務所 AI 工作流(需搭配 extends/law) # # 範例:ENABLED_MODULES=core,knowledge-base,ai-agent,line-bot,public-share,file-manager,skills # 是否啟用 NAS SMB 認證(預設 true) # ENABLE_NAS_AUTH=true # =================== # 開發設定 # =================== # 設為 true 啟用自動重載(開發用,生產環境請設為 false) # UVICORN_RELOAD=false # =================== # HIS 整合設定(可選,需啟用 extends/his 子模組) # =================== # 展望 HIS DBF 資料路徑(掛載後的本機路徑) # 開發環境:NAS 上的測試資料;實機部署時改為 SMB 掛載的 HIS 路徑 # 掛載方式與 SMB 設定請參閱:extends/his/clients//deploy/ # CTHIS_DATA_PATH=/mnt/his-data # =================== # Skill 系統設定 # =================== # 外部 skills 目錄(external-first 載入,優先於內建 skills) # SKILL_EXTERNAL_ROOT=~/SDD/external-skills # 工具路由策略:script-first | mcp-first # SKILL_ROUTE_POLICY=script-first # script 失敗時是否 fallback 到對應 MCP tool # SKILL_SCRIPT_FALLBACK_ENABLED=true # SkillHub 功能開關(預設 false) # SKILLHUB_ENABLED=false # =================== # Brave Search API 設定(research-skill 搜尋 provider) # =================== # 申請網址:https://brave.com/search/api/ # BRAVE_SEARCH_API_KEY=your_brave_search_api_key # research worker 預設模型(建議 claude-opus 提升研究品質) # RESEARCH_CLAUDE_MODEL=claude-opus # 背景 Claude WebSearch/WebFetch timeout(秒,預設 120 = 2 分鐘) # RESEARCH_CLAUDE_TIMEOUT_SEC=120 # check-research 逾時判定分鐘(建議大於 claude timeout + fallback pipeline,預設 10) # RESEARCH_STALE_TIMEOUT_MINUTES=10 # =================== # 文件轉換服務(可選,有預設值) # =================== # MD2PPT_URL=https://md-2-ppt-evolution.vercel.app # MD2DOC_URL=https://md-2-doc-evolution.vercel.app # =================== # CORS 設定 # =================== # 額外允許的 CORS origin(逗號分隔)。新前端 os.ching-tech.com 與本機 Vite dev server 放這裡 CORS_EXTRA_ORIGINS=https://os.ching-tech.com,http://localhost:5173 # =================== # 律師事務所模組(可選,需啟用 extends/law 子模組) # =================== # 案件資料夾根路徑(建立案件時自動建立子資料夾結構) # LAW_DATA_PATH=/mnt/nas/ctos/law/cases # 客戶代碼(對應 extends/law/clients/{code}/,多租戶部署時使用) # LAW_CLIENT= # =================== # GitHub 整合(MCP,用於 Bot Agent 建 Issue / 查 PR) # =================== # 從 GitHub Settings > Developer settings > Personal access tokens 產生 # 需要權限:Issues (Read/Write), Pull requests (Read/Write), Contents (Read) # GITHUB_PERSONAL_ACCESS_TOKEN=github_pat_xxxxx # 預設 repo(Bot Agent prompt 中引用) # GITHUB_DEFAULT_OWNER=yazelin # GITHUB_DEFAULT_REPO=ching-tech-os # =================== # Asana 整合(MCP,用於 Bot Agent 管理任務看板) # =================== # 從 Asana My Settings > Apps > Developer Apps > Personal Access Token 產生 # ASANA_ACCESS_TOKEN=2/xxxxxxxxx # =================== # ERPNext 設定(MCP 整合) # =================== # 已由往來與物料模組取代(2026-09)。bot prompt、skills、ctos CLI 與舊桌面都已切走, # 下面三個變數只剩備份/匯入腳本(scripts/erpnext_export.py)在用。 # ERPNext 停用後移除這三個變數,停用步驟見規格第七節 # (docs/superpowers/specs/2026-09-12-ai-native-erp-design.md)。 # ERPNext 伺服器位址 ERPNEXT_URL=http://your-erpnext-server # 從 ERPNext User 設定中產生 API Key/Secret ERPNEXT_API_KEY=your_api_key ERPNEXT_API_SECRET=your_api_secret