{"id":48921083,"url":"https://github.com/laimokarca/currentevents-chatbot","last_synced_at":"2026-04-17T05:02:17.136Z","repository":{"id":319897769,"uuid":"1062285670","full_name":"LaimoKarca/CurrentEvents-Chatbot","owner":"LaimoKarca","description":"以 Prompt Engineering 建構新聞時事聊天機器人， 利用 OpenAI 的 File_search 與 Web_search 技術，在資訊爆炸的時代，協助大眾快速判斷新聞真偽，並提供持續對話的互動體驗。","archived":false,"fork":false,"pushed_at":"2025-12-12T15:05:19.000Z","size":46218,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-08T07:50:08.696Z","etag":null,"topics":["chatbot","fact-check","fastapi","firebase-hosting","google-cloud-run","news","openai-api","prompt-engineering","vue"],"latest_commit_sha":null,"homepage":"https://currentevents-chatbot.web.app/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LaimoKarca.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-23T04:09:05.000Z","updated_at":"2025-12-12T15:08:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"70560404-7b76-41b6-a05c-8f482cf3155b","html_url":"https://github.com/LaimoKarca/CurrentEvents-Chatbot","commit_stats":null,"previous_names":["liamokarca/currentevents-chatbot","laimokarca/currentevents-chatbot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/LaimoKarca/CurrentEvents-Chatbot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LaimoKarca%2FCurrentEvents-Chatbot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LaimoKarca%2FCurrentEvents-Chatbot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LaimoKarca%2FCurrentEvents-Chatbot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LaimoKarca%2FCurrentEvents-Chatbot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LaimoKarca","download_url":"https://codeload.github.com/LaimoKarca/CurrentEvents-Chatbot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LaimoKarca%2FCurrentEvents-Chatbot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31915900,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"online","status_checked_at":"2026-04-17T02:00:06.879Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chatbot","fact-check","fastapi","firebase-hosting","google-cloud-run","news","openai-api","prompt-engineering","vue"],"created_at":"2026-04-17T05:01:59.676Z","updated_at":"2026-04-17T05:02:17.130Z","avatar_url":"https://github.com/LaimoKarca.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CurrentEvents-Chatbot\n\n以 Prompt Engineering 建構新聞時事聊天機器人，整合 OpenAI `web_search` / `file_search` 能力，協助快速掌握事件脈絡、比對多方來源、標註不確定點，並提供可持續對話的互動體驗。系統採前後端分離架構：前端部署於 Firebase Hosting，後端容器化後部署至 Google Cloud Run；使用者與聊天紀錄以 Firestore 為主。\n\n\u003e 安全提醒：API Key、Service Account、Token Secret 等機密資訊一律放在 `.env`、Cloud Run 環境變數或 Secret Manager，禁止提交到 Git。\n\n---\n\n## 功能概覽\n\n- 新聞時事對話：背景、關鍵人物/組織、時間線、可能走向\n- 引用與查證：透過 `web_search` / `file_search` 取得多來源參考\n- 使用者登入：Firebase Authentication（Email / Google）\n- 對話記憶：Firestore 儲存 chat session 與 message 紀錄\n- 部署：後端 Cloud Run、前端 Firebase Hosting\n\n---\n\n## 專案結構（摘要）\n\n- `backend/`：FastAPI 後端（RAG / 工具呼叫 / Firestore）\n- `frontend/`：Vite + Vue 前端（登入、聊天 UI、呼叫後端 API）\n- `backend/src/knowledge_base_operation/`：新聞知識庫建置流程\n\n---\n\n## 新聞知識庫準備\n\n```bash\npython backend/src/knowledge_base_operation/news_pipeline.py\n````\n\n---\n\n## 環境需求\n\n### 後端\n\n* Python 3.12.3\n* 建議套件：\n\n  ```bash\n  pip install fastapi uvicorn openai python-dotenv\n  ```\n\n### 前端\n\n* Node.js 18+\n* Yarn（或 npm）\n\n---\n\n## 環境變數\n\n### 後端（`.env`）\n\n依實作可能增減，常見欄位如下：\n\n* `OPENAI_API_KEY`\n* `OPENAI_CHAT_MODEL`（例：`gpt-4o`）\n* `OPENAI_ASSISTANT_ID`（系統提示詞可維護於 `backend/src/app/prompts/system/bot.md`）\n* `FIREBASE_SERVICE_ACCOUNT_BASE64`（Firebase Admin SDK 服務帳戶 JSON 的 base64）\n* （若有）`MONGODB_URI`、`AUTH_SECRET`、`TOKEN_EXPIRE_MINUTES`\n\n#### Firebase Admin SDK 金鑰取得\n\nFirebase Console → 專案設定（齒輪）→ 服務帳戶 → Firebase Admin SDK → 選 Python → 產生新的私密金鑰\n\n\u003e 建議：避免把整份 JSON 直接放進 repo；採 base64 後以 Cloud Run 環境變數注入，或改用 Secret Manager。\n\n---\n\n### 前端（`frontend/.env.local`）\n\n```bash\n# 後端 API 位址（本機或 Cloud Run）\nVITE_API_BASE=http://localhost:8000\n\n# Firebase Web App（Vite 環境變數）\nVITE_FIREBASE_API_KEY=\nVITE_FIREBASE_AUTH_DOMAIN=\nVITE_FIREBASE_PROJECT_ID=\nVITE_FIREBASE_STORAGE_BUCKET=\nVITE_FIREBASE_MESSAGING_SENDER_ID=\nVITE_FIREBASE_APP_ID=\nVITE_FIREBASE_MEASUREMENT_ID=\n\n#（選用）Firebase Emulator\nVITE_USE_AUTH_EMULATOR=false\n# 使用方式：firebase emulators:start --only auth\n\n# Hosting 登入的 URL\nHOSTED_LOGIN_URL=\u003cHosting 預設網址\u003e/login\n```\n\n\u003e 注意：鍵名需與程式碼 `import.meta.env.VITE_FIREBASE_*` 完全一致（大小寫不可混用）。\n\n---\n\n## 本機啟動\n\n### 後端（本地）\n\n```bash\nuvicorn backend.src.app.main:app --reload --log-level debug\n```\n\n### 前端（本地）\n\n```bash\ncd frontend\nyarn install\nyarn dev\n```\n\n---\n\n## Firebase（前端）Authentication + Hosting 設置與部署\n\n### 1) 安裝 Firebase SDK\n\n```bash\ncd frontend\nyarn add firebase\n# 或 npm install firebase\n```\n\n### 2) Firebase Console：建立 Web App（取得設定）\n\nFirebase Console →（專案）→「新增應用程式」→ 選 `\u003c/\u003e`（Web）→ 註冊\n取得的設定值請放入 `frontend/.env.local`（不要硬編碼在程式碼內）。\n\n### 3) 建立 `src/services/firebase.ts`\n\n（檔案需自行新增）\n\n```ts\nimport { initializeApp } from \"firebase/app\";\nimport { getAnalytics } from \"firebase/analytics\";\n\nconst firebaseConfig = {\n  apiKey: import.meta.env.VITE_FIREBASE_API_KEY,\n  authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN,\n  projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID,\n  storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET,\n  messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID,\n  appId: import.meta.env.VITE_FIREBASE_APP_ID,\n  measurementId: import.meta.env.VITE_FIREBASE_MEASUREMENT_ID,\n};\n\nconst app = initializeApp(firebaseConfig);\nconst analytics = getAnalytics(app);\n\nexport { app, analytics };\n```\n\n\u003e 修改 `.env.local` 後需重跑 `yarn dev` 或 `yarn build`，Vite 才會載入最新設定。\n\n---\n\n### 4) Firebase Console：啟用 Authentication（Email / Google）\n\nFirebase Console → Authentication → Sign-in method（登入方式）：\n\n* 啟用 **Email/Password**\n* 啟用 **Google**\n\n同時建議檢查：\n\n* Authentication → Settings（設定）→ **Authorized domains**\n\n  * 確認已包含 Firebase Hosting 網域（例如 `*.web.app` / `*.firebaseapp.com`）\n  * 若使用自訂網域，也需加入\n\n---\n\n### 5) 安裝 Firebase CLI 並登入\n\n```bash\nnpm install -g firebase-tools\nfirebase login\n```\n\n---\n\n### 6) 初始化 Hosting（務必在 `frontend/` 內執行）\n\n```bash\ncd frontend\nfirebase init\n```\n\n建議選項：\n\n* 勾選 **Hosting**\n* 視需求可一併勾選 **Firestore**（若要用 CLI 管理 Rules/Indexes）\n* 選擇已存在的 Firebase 專案\n* Deploy to GitHub：選 `n`\n\n\u003e 補充：`firebase.json` 需與 `package.json` 同層（皆在 `frontend/`），`firebase deploy` 才能正確辨識前端專案。\n\n---\n\n### 7) 設定 `firebase.json` 指向 Vite 輸出目錄\n\n`frontend/firebase.json`（重點是 `public: \"dist\"`）：\n\n```json\n{\n  \"hosting\": {\n    \"public\": \"dist\"\n  }\n}\n```\n\n---\n\n### 8) 部署到 Firebase Hosting（標準流程）\n\n```bash\ncd frontend\nyarn install\nyarn run build\nfirebase deploy --only hosting\n```\n\n部署完成後，點擊 Hosting URL：\n\n* 若看到專案畫面即代表成功\n* 若仍是 Firebase Welcome Page，通常是 `dist/index.html` 沒更新或快取造成（見下方 Troubleshooting）\n\n---\n\n### 9) 前端更新後重新部署（以此為準）\n\n```bash\ncd frontend\nyarn install\nyarn run build\nfirebase deploy --only hosting\n```\n\n---\n\n## Firestore 啟用與設置\n\nFirebase Console → Firestore Database → 建立資料庫即可。\nRules 文件（官方）：[https://firebase.google.com/docs/rules/get-started?hl=zh-TW](https://firebase.google.com/docs/rules/get-started?hl=zh-TW)\n\n\u003e 後端使用 Admin SDK 可進行伺服端存取；前端存取需搭配 Security Rules 設計。\n\n---\n\n## 後端部署到 Google Cloud Run（Docker + Artifact Registry）\n\n### 1) gcloud 初始化與設定區域\n\n```bash\ngcloud init\ngcloud config set run/region asia-east1\ngcloud config get-value project\n```\n\n### 2) 撰寫 Dockerfile 與 .dockerignore\n\n* 後端需有 `Dockerfile`\n* 建議 `.dockerignore` 排除 `frontend/`、`node_modules/`、`dist/` 等內容，縮小 image 體積\n\n### 3) 本機 build（tag 可先用 dev）\n\n```bash\ncd ~/dev/CurrentEvents-Chatbot\ndocker build -t ce-backend:dev -f Dockerfile .\n```\n\n### 4) 本機執行（建議用 .env 注入，避免把機密寫在指令）\n\n```bash\ndocker run --rm -p 8080:8080 --env-file .env ce-backend:dev\n```\n\n驗證 Swagger：\n\n* [http://localhost:8080/docs](http://localhost:8080/docs)\n\n---\n\n### 5) 建立 Artifact Registry（只需一次）\n\n```bash\nPROJECT_ID=$(gcloud config get-value project)\nREGION=asia-east1\nREPO=currentevents-backend\nIMAGE_NAME=backend-api\n\ngcloud artifacts repositories create $REPO \\\n  --repository-format=docker \\\n  --location=$REGION \\\n  --description=\"Container images for CurrentEvents-Chatbot backend\"\n\ngcloud auth configure-docker $REGION-docker.pkg.dev\n```\n\n---\n\n### 6) Build 正式 image 並 push\n\n```bash\ncd ~/dev/CurrentEvents-Chatbot\n\nPROJECT_ID=$(gcloud config get-value project)\nREGION=asia-east1\nREPO=currentevents-backend\nIMAGE_NAME=backend-api\nTAG=v1\n\ndocker build -t $REGION-docker.pkg.dev/$PROJECT_ID/$REPO/$IMAGE_NAME:$TAG -f Dockerfile .\ndocker push $REGION-docker.pkg.dev/$PROJECT_ID/$REPO/$IMAGE_NAME:$TAG\n```\n\n---\n\n### 7) 部署到 Cloud Run\n\n```bash\ngcloud run deploy currentevents-backend \\\n  --image=$REGION-docker.pkg.dev/$PROJECT_ID/$REPO/$IMAGE_NAME:$TAG \\\n  --platform=managed \\\n  --region=$REGION \\\n  --allow-unauthenticated \\\n  --port=8080 \\\n  --cpu=1 \\\n  --memory=512Mi \\\n  --concurrency=80 \\\n  --min-instances=0 \\\n  --max-instances=5 \\\n  --set-env-vars=\"ENV=prod\"\n```\n\n\u003e 環境變數（如 `OPENAI_API_KEY`、`FIREBASE_SERVICE_ACCOUNT_BASE64`）建議於 Cloud Run Console：\n\u003e 服務 → 編輯及部署新修訂版本 → 容器 →「變數與密鑰」設定後再部署。\n\n---\n\n## 串接到前端（上線）\n\n1. 取得 Cloud Run 服務 URL\n2. 更新 `frontend/.env.local`：\n\n```bash\nVITE_API_BASE=https://\u003ccloud-run-service-url\u003e\n```\n\n3. 重新部署前端：\n\n```bash\ncd frontend\nyarn install\nyarn run build\nfirebase deploy --only hosting\n```\n\n---\n\n## 後端版本更新（建議做法：換 tag 便於回滾）\n\n```bash\ncd ~/dev/CurrentEvents-Chatbot\n\nPROJECT_ID=$(gcloud config get-value project)\nREGION=asia-east1\nREPO=currentevents-backend\nIMAGE_NAME=backend-api\nTAG=v9\n\nFULL_IMAGE=\"$REGION-docker.pkg.dev/$PROJECT_ID/$REPO/$IMAGE_NAME:$TAG\"\n\ndocker build -t \"$FULL_IMAGE\" -f Dockerfile .\ndocker push \"$FULL_IMAGE\"\n\ngcloud run deploy currentevents-backend \\\n  --image=\"$FULL_IMAGE\" \\\n  --platform=managed \\\n  --region=$REGION \\\n  --allow-unauthenticated\n```\n\nCloud Run 會建立新 revision 並切換流量到新版；舊版保留可回滾。\n\n---\n\n##（選用）Firebase Emulator：離線整合測試\n\n```bash\nfirebase init emulators\n# 勾 Auth emulator、Firestore emulator 等\n```\n\n前端可在開發模式連 emulator（示意）：\n\n```ts\nimport { getAuth, connectAuthEmulator } from \"firebase/auth\";\n\nexport const auth = getAuth(app);\n\nif (import.meta.env.VITE_USE_AUTH_EMULATOR === \"true\") {\n  connectAuthEmulator(auth, \"http://localhost:9099\", { disableWarnings: true });\n}\n```\n\n`.env.local`：\n\n```bash\nVITE_USE_AUTH_EMULATOR=true\n```\n\n---\n\n## Troubleshooting\n\n### 1) 部署後仍顯示 Firebase Welcome Page\n\n* 確認 `frontend/firebase.json` 的 `public` 為 `dist`\n* 確認已執行 `yarn run build` 且 `dist/index.html` 存在：\n\n  ```bash\n  cd frontend\n  yarn run build\n  ls dist\n  ```\n* 用無痕視窗檢查，或清除快取\n\n### 2) 前端讀不到 Firebase 設定\n\n* 檢查 `.env.local` 變數鍵名是否與 `import.meta.env.VITE_FIREBASE_*` 完全一致\n* 修改 `.env.local` 後需重跑 `yarn dev` / `yarn run build`\n\n### 3) Cloud Run 啟動失敗\n\n* 優先檢查 Cloud Run 的環境變數是否已補齊\n* 檢查容器是否監聽在 8080（Cloud Run 預設）","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaimokarca%2Fcurrentevents-chatbot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaimokarca%2Fcurrentevents-chatbot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaimokarca%2Fcurrentevents-chatbot/lists"}