diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..74b7877 --- /dev/null +++ b/.env.example @@ -0,0 +1,29 @@ +# ============================================================================= +# 环境变量配置模板 +# 复制此文件为 .env 并填入真实值:cp .env.example .env +# ============================================================================= + +# ----------------------------------------------------------------------------- +# AI 模型 API 密钥(必需) +# ----------------------------------------------------------------------------- + +# 智谱 AI API 密钥(用于在线模型调用 GLM-4.7-Flash) +# 获取地址: https://open.bigmodel.cn/ +ZHIPUAI_API_KEY=your_zhipuai_api_key_here + +# 本地 vLLM 服务认证 Token(用于本地 Gemma 模型调用) +# 如果使用本地 vLLM 容器,需要设置此值与 vLLM 容器的 --api-key 参数一致 +VLLM_LOCAL_KEY=token-abc123 + +# ----------------------------------------------------------------------------- +# 数据库配置(可选 - 代码中有默认值) +# ----------------------------------------------------------------------------- + +# PostgreSQL 数据库连接字符串 +# Docker Compose 部署时使用服务名 'postgres': +# DB_URI=postgresql://postgres:mysecretpassword@postgres:5432/langgraph_db?sslmode=disable + +# 本地开发时使用 localhost: +# DB_URI=postgresql://postgres:mysecretpassword@localhost:5432/langgraph_db?sslmode=disable + +# 如果不设置,代码将使用默认值(Docker 环境指向 postgres 服务) diff --git a/QUICKSTART.md b/QUICKSTART.md index ce29c76..5a101b0 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -13,20 +13,32 @@ #### 1. 配置环境变量 ```bash -cat > .env << EOF -ZHIPUAI_API_KEY=your_zhipuai_api_key_here -VLLM_LOCAL_KEY=token-abc123 -EOF +# 复制模板文件 +cp .env.example .env + +# 编辑 .env 文件,填入真实的 API Key +vim .env # 或使用你喜欢的编辑器 ``` +**必需配置项**: +- `ZHIPUAI_API_KEY` - 智谱 AI API 密钥(从 [智谱开放平台](https://open.bigmodel.cn/) 获取) +- `VLLM_LOCAL_KEY` - 本地 vLLM 服务认证 Token(与 vLLM 容器的 `--api-key` 参数一致) + +**可选配置项**: +- `DB_URI` - PostgreSQL 连接字符串(默认已配置,通常无需修改) + #### 2. 启动服务 ```bash -docker compose up -d --build +docker compose -f docker/docker-compose.yml up -d --build ``` #### 3. 访问应用 +**如果配置了 Nginx 反向代理**: +- 访问地址:`http://your-domain.com` 或 `http://your-server-ip` + +**如果未配置 Nginx(直接访问容器)**: - **前端**: http://localhost:8501 - **后端 API**: http://localhost:8001 @@ -77,10 +89,21 @@ pip install -r requirement.txt #### 3. 配置环境变量 -编辑 `.env` 文件: +复制并编辑 `.env` 文件: + +```bash +cp .env.example .env +vim .env +``` + +**本地开发需要额外配置数据库连接**: ```env ZHIPUAI_API_KEY=your_api_key_here +VLLM_LOCAL_KEY=token-abc123 + +# 本地开发时,数据库主机改为 localhost +DB_URI=postgresql://postgres:mysecretpassword@localhost:5432/langgraph_db?sslmode=disable ``` #### 4. 启动服务 @@ -95,7 +118,7 @@ python backend.py streamlit run frontend.py ``` -浏览器自动打开 http://localhost:8501 +浏览器自动打开前端页面(如果配置了 Nginx,访问 `http://your-domain.com`;否则访问 http://localhost:8501) --- diff --git a/README.md b/README.md index ca0dce4..d191ff0 100644 --- a/README.md +++ b/README.md @@ -104,21 +104,24 @@ Agent1/ ### 方式一:Docker Compose(推荐) -```bash -# 1. 配置 .env 文件 -echo "ZHIPUAI_API_KEY=your_key_here" > .env +``` +# 1. 配置环境变量 +cp .env.example .env +# 编辑 .env 文件,填入真实的 API Key # 2. 启动所有服务 -docker compose up -d --build +docker compose -f docker/docker-compose.yml up -d --build # 3. 访问应用 -# 前端: http://localhost:8501 -# 后端: http://localhost:8001 +# 如果配置了 Nginx 反向代理:http://your-domain.com 或 http://your-server-ip +# 如果未配置 Nginx(直接访问): +# - 前端: http://localhost:8501 +# - 后端 API: http://localhost:8001 ``` ### 方式二:本地开发模式 -```bash +``` # 1. 启动 PostgreSQL docker run -d --name postgres-langgraph \ -e POSTGRES_PASSWORD=mysecretpassword \ @@ -178,7 +181,7 @@ streamlit run frontend.py 在 `tools.py` 中添加新的 `@tool` 装饰函数: -```python +``` @tool def my_new_tool(param: str) -> str: """ @@ -200,7 +203,7 @@ def my_new_tool(param: str) -> str: 在 `agent.py` 的 `initialize()` 方法中添加模型配置: -```python +``` model_configs = { "zhipu": self._create_zhipu_llm, "local": self._create_local_llm, @@ -227,7 +230,7 @@ model_configs = { 在 `.env` 文件中配置: -```env +``` # 智谱 AI API Key(必需) ZHIPUAI_API_KEY=your_api_key_here @@ -242,6 +245,10 @@ VLLM_LOCAL_KEY=token-abc123 postgresql://postgres:mysecretpassword@localhost:5432/langgraph_db ``` +**注意**: +- **本地开发模式**:使用 `localhost` 或 `127.0.0.1` +- **Docker Compose 部署**:后端容器内应使用服务名 `postgres`(通过环境变量 `DB_URI` 自动配置) + 如使用 Docker Compose,数据库会在内部网络中自动配置。 --- diff --git a/app/backend.py b/app/backend.py index 69f312a..0df0c2e 100644 --- a/app/backend.py +++ b/app/backend.py @@ -3,6 +3,7 @@ FastAPI 后端 - 支持动态模型切换,使用 PostgreSQL 持久化记忆 采用依赖注入模式,优雅管理资源生命周期 """ +import os import uuid from contextlib import asynccontextmanager @@ -13,8 +14,11 @@ from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver from app.agent import AIAgentService -# PostgreSQL 连接字符串 -DB_URI = "postgresql://postgres:mysecretpassword@localhost:5432/langgraph_db?sslmode=disable" +# PostgreSQL 连接字符串(优先从环境变量读取,适配 Docker 和本地开发) +DB_URI = os.getenv( + "DB_URI", + "postgresql://postgres:mysecretpassword@postgres:5432/langgraph_db?sslmode=disable" +) @asynccontextmanager diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 42fda2e..8d155cf 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -37,6 +37,8 @@ services: postgres: condition: service_healthy restart: unless-stopped + ports: + - "127.0.0.1:8001:8001" # 仅本机访问,供 Nginx 反向代理使用 frontend: build: @@ -44,9 +46,9 @@ services: dockerfile: docker/Dockerfile.frontend container_name: ai-frontend environment: - - API_URL=http://backend:8001/chat + - API_URL=/api/chat # 通过 Nginx 反向代理访问后端 ports: - - "8501:8501" + - "127.0.0.1:8501:8501" # 仅本机访问,供 Nginx 反向代理使用 networks: - ai-network depends_on: diff --git a/frontend/frontend.py b/frontend/frontend.py index 3ac8117..14088f6 100644 --- a/frontend/frontend.py +++ b/frontend/frontend.py @@ -9,8 +9,12 @@ import uuid import requests import streamlit as st -# 后端 API 地址(端口 8001) -API_URL = "http://localhost:8001/chat" + +# 原来的硬编码,本地测试 +# API_URL = "http://115.190.121.151:8001/chat" + +# 改为相对路径(由 Nginx 代理转发) +API_URL = "/api/chat" st.set_page_config(page_title="AI 个人助手", page_icon="🤖") st.title("🤖 个人生活与数据分析助手") diff --git a/scripts/start.sh b/scripts/start.sh index a7e72a3..9b6b737 100755 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -100,7 +100,7 @@ start_frontend() { streamlit run frontend/frontend.py & FRONTEND_PID=$! echo -e "${GREEN}✓ 前端服务已启动 (PID: $FRONTEND_PID)${NC}" - echo -e "${GREEN}✓ 请在浏览器中打开: http://localhost:8501${NC}" + echo -e "${GREEN}✓ 请在浏览器中打开: http://localhost:8501(本地开发)或 http://your-domain.com(Nginx 代理)${NC}" } # 清理函数