光源智控股份有限公司的雙語企業網站與內部 AI 業務演練系統。專案以 Next.js App Router 建置,包含繁體中文與英文頁面、Jerry 智慧客服(文字/語音/拍照)、以真實實績算出來的資料視覺化、聯絡表單、實績影音,以及受管理員驗證保護的模擬客戶演練後台與數據看板。
- 正式網站:illumination-intelligence.vercel.app
- 原始碼:github.com/JerryTsai0708/illumination-intelligence
- 現場示範操作手冊:
docs/demo-runbook.md
/zh-TW、/en雙語企業內容;型別強制兩個語系同時存在- 智慧照明產品、EMC、案例、新聞、FAQ、下載與聯絡頁面
- 完整現場實績影片與延遲載入播放器
- 資料視覺化:節能率排行、案場類型分布、節能率 × 年減碳散點、年減碳量組成、
感測半徑 vs 通訊半徑、逐時負載示意、follow-me 動線圖。全部由
src/content/site.ts的 實績資料推導,每張圖都附可展開的資料表;示意性質的圖另有虛線邊框與 「示意圖,非實測數據」徽章 - Jerry 智慧客服:語意檢索(向量 + 重排)→ 模型回覆 → 事實校驗;支援語音提問、 語音播報與拍照診斷;沒有金鑰時自動降級為規則式回覆,功能不會消失只會標示降級
- 聯絡表單、Email 通知與限流
- 明暗主題、響應式版面、鍵盤可及的圖表
- 演練工作台
/zh-TW/admin:與 AI 模擬客戶對話、整理需求、組合模擬商品、送出提案並評分; 另有「AI 自動演示」模式,由 AI 顧問與 AI 客戶自動跑完一整場 - 數據看板
/zh-TW/admin/analytics:KPI、能力雷達、學習曲線、需求覆蓋矩陣、 預算散點、風險旗標,以及 AI 護欄指標(直通率 / 修復率 / 規則兜底率) - 沒有
DATABASE_URL時,兩者都會降級到內建的確定性演示資料,並在畫面上以琥珀色橫幅 標示「演示資料 / Demo data」
- Next.js 15 App Router、React 19、TypeScript strict(全倉 0 個
any/@ts-ignore/eslint-disable) - Tailwind CSS v4、CSS Modules(後台)、Framer Motion
- 自建的 LLM 平台層
src/lib/llm:供應商解析、模型鏈與備援、逾時與預算、個資遮蔽; chat / vision / embed / rerank / STT / TTS 六種任務共用同一套契約 - 圖表全部是手寫 SVG 與 CSS,沒有圖表函式庫
- PostgreSQL / Neon + Drizzle ORM(僅內部演練系統)
- NextAuth(管理員驗證)
- 測試:Node 內建 test runner
需要 Node.js 20+ 與 pnpm。
git clone https://github.com/JerryTsai0708/illumination-intelligence.git
cd illumination-intelligence
pnpm install --frozen-lockfile
cp .env.example .env.local
pnpm dev瀏覽 http://localhost:3000/zh-TW。Windows 請把 cp 改成 copy。
網站在完全沒有外部服務時仍可建置與瀏覽:公開頁面不查資料庫、不呼叫模型。 Jerry 的模型能力、Email 寄送、資料庫與管理後台各自需要對應的環境變數,缺少時一律降級而非報錯。
所有可用變數都列在 .env.example,該檔的註解就是說明文件。常用設定:
NEXT_PUBLIC_SITE_URL:正式網站網址(同時決定 sitemap 與 OG 卡片的絕對路徑)。GPTGE_BASE_URL、GPTGE_API_KEY:新部署的 GPT.GE 預設閘道;文字與模擬對話預設使用gpt-4o-mini。LLM_MODEL_CHAT/_EMBED/_RERANK/_STT/_TTS:各任務的模型鏈,逗號分隔, 第一個是主模型、其餘為備援。Jerry 測試通道視覺診斷固定使用 GPT.GEgpt-5.6-sol。ASSISTANT_MODE:留空即可。語意是「有金鑰就啟用模型;只有明確填入mock才強制 改用內建規則」。填了mock會讓 Jerry 全程走規則式回覆,而畫面上只會少一個模型徽章, 現場很難察覺。LLM_PROVIDER:openai-compatible、siliconflow、gptge、openai或gemini。 指定的供應商若沒有金鑰會被忽略,自動退回解析順序。CONTACT_TO_EMAIL、CONTACT_FROM_EMAIL與 Resend 或 SMTP 變數:聯絡表單通知。DATABASE_URL:PostgreSQL / Neon 連線字串(只有演練系統與聯絡線索會用到)。NEXTAUTH_SECRET、ADMIN_EMAIL、ADMIN_PASSWORD:管理後台驗證。缺NEXTAUTH_SECRET時後台會顯示一頁設定說明,而不是 500。RATE_LIMIT_*、ASSISTANT_*_RATE_LIMIT_*、SIMULATOR_*_RATE_LIMIT_*:各端點限流。 公開展場請調高 Jerry 的上限,全場觀眾共用同一個出口 IP。LOGIN_BACKOFF_*:管理員登入失敗的指數退避。
請勿把 .env.local、API key、資料庫密碼或真實客戶資料提交到 Git。
Jerry 在沒有任何金鑰時仍然可用:走規則式回覆 + 關鍵字檢索,並在 UI 上標示為降級模式。 設定金鑰之後會自動啟用完整路徑:
- 語意檢索:
text-embedding-3-small建索引 → rerank 模型重排 → 取前 4 條已核准知識 - 模型回覆:把知識、對話與線索草稿組成提示詞,輸入先經過個資遮蔽與注入偵測
- 事實校驗:節能率、認證、價格、保固、回收期等宣稱必須有知識條目佐證, 否則要求模型改寫一次,仍不合格就整段丟棄改用規則式安全回覆
模型失敗、逾時或額度不足時一律回到規則式備用回覆,對話不會中斷。
預設閘道(OpenAI-compatible):
GPTGE_BASE_URL=https://api.gpt.ge/v1
GPTGE_API_KEY=your_server_side_key
LLM_MODEL_CHAT=gpt-4o-mini
LLM_MODEL_EMBED=text-embedding-3-smallSiliconFlow legacy fallback(僅在未設定 GPTGE_API_KEY 時使用):
LLM_PROVIDER=siliconflow
OPENAI_COMPATIBLE_BASE_URL=https://api.siliconflow.cn/v1
OPENAI_COMPATIBLE_API_KEY=your_server_side_key
OPENAI_COMPATIBLE_MODEL=deepseek-ai/DeepSeek-V3.2
OPENAI_COMPATIBLE_FALLBACK_MODEL=deepseek-ai/DeepSeek-V4-FlashJerry 的照片診斷使用獨立的 GPT.GE gpt-5.6-sol 憑證,不會改變文字對話設定。端點固定為 https://api.gpt.ge/v1、模型固定為 gpt-5.6-sol;只需在伺服器端設定以下金鑰,請勿加上 NEXT_PUBLIC_,也不要把真實金鑰寫入 .env.example 或提交到 Git:
VISION_OPENAI_COMPATIBLE_API_KEY=your_server_side_vision_key演練器也使用相同的 GPT.GE gpt-4o-mini 閘道。SIMULATOR_OPENAI_COMPATIBLE_* 僅作為 legacy fallback,只有未設定 GPTGE_API_KEY 時才會使用。
視覺診斷只在持有有效簽名 Cookie 的繁中 Jerry 模擬測試通道開放,正式 Jerry 與英文頁面都不顯示照片工具。啟用測試通道時仍須另外設定既有的 JERRY_SIMULATION_TEST_ENABLED、JERRY_SIMULATION_TEST_TOKEN 與 JERRY_SIMULATION_TEST_COOKIE_SECRET;只有視覺金鑰並不會公開照片功能。照片觀察只是 GPT.GE gpt-5.6-sol 的初步判讀,必須由測試者以文字確認後,才會進入原有七項需求評估。
Gemini 範例:
LLM_PROVIDER=gemini
GEMINI_API_KEY=your_server_side_key
GEMINI_MODEL=gemini-3-flash-previewAPI key 只能放在伺服器端環境變數,不可使用 NEXT_PUBLIC_ 前綴。
| 能力 | 端點 | 說明 |
|---|---|---|
| 拍照診斷(僅繁中 Jerry 簽名測試通道) | POST /api/assistant/vision |
需有效測試 Cookie;4MB / 2048px 上限、magic-byte 型別檢查、EXIF 與 XMP 剝除後才送出。照片不落盤、不進資料庫,觀察結果須由使用者文字確認後才更新七項評估 |
| 語音提問 | POST /api/assistant/voice/transcribe |
whisper 轉寫 + 繁體正規化 + 專有名詞校正 |
| 語音播報 | POST /api/assistant/voice/speak |
TTS,模型鏈可備援 |
| 能力探測 | GET /api/assistant/capabilities |
前端據此決定顯示哪些控制項;沒有金鑰的能力直接隱藏按鈕,不會出現「按了就報錯」 |
正式收件人設定如下,寄件服務可選擇 Resend 或 SMTP:
CONTACT_TO_EMAIL=y2008412@hotmail.com
CONTACT_FROM_EMAIL="Illumination Intelligence <noreply@your-domain.com>"
RESEND_API_KEY=your_server_side_key若使用 SMTP,請改為填寫 SMTP_HOST、SMTP_PORT、SMTP_USER 與 SMTP_PASS。
設定 CONTACT_REQUIRE_EMAIL=true 可要求郵件寄送成功後才接受表單。
沒有任何寄送服務時,線索會寫入本機 spool,回應中的 delivery.durable 會據實回報。
pnpm db:migrate
pnpm db:seed遷移檔位於 drizzle/,來源是 src/db/schema.ts(六張 simulation_* 表)。
模擬客戶、商品與金額均為內部演練資料,不代表正式商品、報價或對外承諾。
資料架構與「哪些表其實不存在」請見 docs/cms-architecture.md。
pnpm exec tsc --noEmit
pnpm lint
pnpm test
pnpm build專案可直接部署至 Vercel。將所需環境變數設在 Vercel Project Settings,再執行正式部署。
注意 ILLUM_BUILD_* 是建置期的設定快照,補完環境變數之後必須重新建置才會生效。
vercel.json 指定了 hkg1 區域與 60 秒 maxDuration,這兩項都需要付費方案。
不要把 Vercel 或其他平台的秘密值寫入倉庫。
| 檔案 | 內容 |
|---|---|
docs/demo-runbook.md |
現場示範的完整操作手冊:環境檢查、動線、話術、Plan B |
docs/project-structure.md |
目錄與模組地圖 |
docs/cms-architecture.md |
內容與資料架構,含資料庫真實邊界 |
docs/design-system.md |
色彩 token、資料視覺化色票、可及性規則 |
docs/jerry-knowledge-base.md |
Jerry 知識庫治理與維護流程 |
docs/simulator-usage-guide.md |
演練系統使用說明 |
docs/seo-strategy.md |
SEO 策略與現況 |
design-qa.md |
視覺與可及性驗收紀錄 |
程式碼依 MIT License 開放使用。
公司名稱、商標、Logo、品牌圖案、照片、影片、客戶案例、公司簡報、文案、資料與其他品牌資產不包含在 MIT 授權內,權利由光源智控股份有限公司保留。詳細邊界請見 ASSET-LICENSE.md。Fork 此專案公開使用前,請替換這些公司資產與內容。
請先閱讀 CONTRIBUTING.md。安全問題請依 SECURITY.md 私下回報,不要在公開 Issue 放入密鑰、漏洞細節或客戶資料。
The internal Jerry evaluation workflow is documented in
docs/jerry-evaluation-operations.md.
It uses GPTGE_API_KEY and GPTGE_BASE_URL from .env.local or Vercel
environment settings only. Never commit API keys or tokens. Evaluation runs and
candidates do not publish changes to public Jerry.