setup.sh 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #!/usr/bin/env bash
  2. # ============================================================
  3. # LambdAgent PaaS 一键安装启动脚本
  4. # 用法:
  5. # chmod +x setup.sh
  6. # ./setup.sh # 安装并启动(开发模式)
  7. # ./setup.sh --docker # 使用 Docker 启动
  8. # ./setup.sh --help # 查看帮助
  9. # ============================================================
  10. set -e
  11. # ── 颜色输出 ──────────────────────────────────────────────
  12. RED='\033[0;31m'
  13. GREEN='\033[0;32m'
  14. YELLOW='\033[1;33m'
  15. BLUE='\033[0;34m'
  16. NC='\033[0m' # No Color
  17. info() { echo -e "${BLUE}[INFO]${NC} $1"; }
  18. ok() { echo -e "${GREEN}[OK]${NC} $1"; }
  19. warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
  20. fail() { echo -e "${RED}[FAIL]${NC} $1"; exit 1; }
  21. # ── 项目根目录 ────────────────────────────────────────────
  22. PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
  23. cd "$PROJECT_DIR"
  24. # ── 帮助信息 ──────────────────────────────────────────────
  25. show_help() {
  26. echo ""
  27. echo "LambdAgent PaaS 一键安装启动脚本"
  28. echo ""
  29. echo "用法:"
  30. echo " ./setup.sh 安装依赖并启动服务(开发模式)"
  31. echo " ./setup.sh --docker 使用 Docker Compose 启动"
  32. echo " ./setup.sh --install 仅安装依赖,不启动服务"
  33. echo " ./setup.sh --launch 安装并一键启动 Agent 对话"
  34. echo " ./setup.sh --help 显示此帮助信息"
  35. echo ""
  36. echo "环境要求:"
  37. echo " Python 方式: Python 3.10+"
  38. echo " Docker 方式: Docker + Docker Compose"
  39. echo ""
  40. }
  41. # ── 检查 Python ───────────────────────────────────────────
  42. check_python() {
  43. if command -v python3 &>/dev/null; then
  44. PYTHON=python3
  45. elif command -v python &>/dev/null; then
  46. PYTHON=python
  47. else
  48. fail "未找到 Python。请安装 Python 3.10+\n macOS: brew install python@3.12\n Ubuntu: sudo apt install python3 python3-venv python3-pip"
  49. fi
  50. # 检查版本
  51. PY_VERSION=$($PYTHON -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
  52. PY_MAJOR=$($PYTHON -c 'import sys; print(sys.version_info.major)')
  53. PY_MINOR=$($PYTHON -c 'import sys; print(sys.version_info.minor)')
  54. if [ "$PY_MAJOR" -lt 3 ] || { [ "$PY_MAJOR" -eq 3 ] && [ "$PY_MINOR" -lt 10 ]; }; then
  55. fail "Python 版本过低: $PY_VERSION(需要 3.10+)"
  56. fi
  57. ok "Python $PY_VERSION"
  58. }
  59. # ── 检查 Docker ───────────────────────────────────────────
  60. check_docker() {
  61. if ! command -v docker &>/dev/null; then
  62. fail "未找到 Docker。请先安装 Docker Desktop\n https://www.docker.com/products/docker-desktop/"
  63. fi
  64. if ! docker info &>/dev/null 2>&1; then
  65. fail "Docker 未运行。请启动 Docker Desktop"
  66. fi
  67. if ! command -v docker-compose &>/dev/null && ! docker compose version &>/dev/null 2>&1; then
  68. fail "未找到 Docker Compose"
  69. fi
  70. ok "Docker $(docker --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')"
  71. }
  72. # ── 配置 .env 文件 ────────────────────────────────────────
  73. setup_env() {
  74. if [ ! -f .env ]; then
  75. if [ -f .env.example ]; then
  76. cp .env.example .env
  77. warn ".env 文件已从 .env.example 创建"
  78. echo ""
  79. echo " ┌─────────────────────────────────────────────┐"
  80. echo " │ 请编辑 .env 文件,填入你的 LLM API Key: │"
  81. echo " │ │"
  82. echo " │ 至少填写以下其中一个: │"
  83. echo " │ DASHSCOPE_API_KEY=sk-xxx │"
  84. echo " │ OPENAI_API_KEY=sk-xxx │"
  85. echo " │ ANTHROPIC_API_KEY=sk-xxx │"
  86. echo " │ DEEPSEEK_API_KEY=sk-xxx │"
  87. echo " │ │"
  88. echo " │ 编辑命令: nano .env 或 vim .env │"
  89. echo " └─────────────────────────────────────────────┘"
  90. echo ""
  91. read -p "是否现在编辑 .env 文件?(y/N) " -r
  92. if [[ $REPLY =~ ^[Yy]$ ]]; then
  93. if command -v nano &>/dev/null; then
  94. nano .env
  95. elif command -v vim &>/dev/null; then
  96. vim .env
  97. else
  98. info "请手动编辑 .env 文件后重新运行此脚本"
  99. exit 0
  100. fi
  101. fi
  102. fi
  103. else
  104. ok ".env 文件已存在"
  105. fi
  106. }
  107. # ── 创建虚拟环境并安装依赖 ────────────────────────────────
  108. install_deps() {
  109. info "创建 Python 虚拟环境..."
  110. if [ ! -d .venv ]; then
  111. $PYTHON -m venv .venv
  112. ok "虚拟环境已创建: .venv/"
  113. else
  114. ok "虚拟环境已存在: .venv/"
  115. fi
  116. # 激活虚拟环境
  117. source .venv/bin/activate
  118. info "安装依赖..."
  119. # 安装 lambdagent(核心库)
  120. pip install -e ".[all]" --quiet 2>&1 | tail -1
  121. ok "lambdagent 已安装"
  122. # 安装 agentpaas(服务层)
  123. pip install -e "./agentpaas[dev]" --quiet 2>&1 | tail -1
  124. ok "agentpaas 已安装"
  125. echo ""
  126. ok "所有依赖安装完成!"
  127. echo ""
  128. echo " 激活虚拟环境: source .venv/bin/activate"
  129. echo ""
  130. }
  131. # ── Python 方式启动 ───────────────────────────────────────
  132. start_python() {
  133. source .venv/bin/activate
  134. # 加载 .env
  135. if [ -f .env ]; then
  136. set -a
  137. source .env
  138. set +a
  139. fi
  140. info "启动 AgentPaaS 服务(开发模式)..."
  141. echo ""
  142. echo " ┌─────────────────────────────────────────────┐"
  143. echo " │ 服务地址: http://localhost:${AGENTPAAS_PORT:-8000} │"
  144. echo " │ API 文档: http://localhost:${AGENTPAAS_PORT:-8000}/docs │"
  145. echo " │ 按 Ctrl+C 停止服务 │"
  146. echo " └─────────────────────────────────────────────┘"
  147. echo ""
  148. python -m agentpaas serve --dev
  149. }
  150. # ── Docker 方式启动 ───────────────────────────────────────
  151. start_docker() {
  152. check_docker
  153. setup_env
  154. info "使用 Docker Compose 启动..."
  155. # 使用根目录的 docker-compose
  156. if docker compose version &>/dev/null 2>&1; then
  157. COMPOSE_CMD="docker compose"
  158. else
  159. COMPOSE_CMD="docker-compose"
  160. fi
  161. $COMPOSE_CMD -f docker-compose.yml up --build
  162. }
  163. # ── 一键启动 Agent 对话 ───────────────────────────────────
  164. launch_agent() {
  165. source .venv/bin/activate
  166. # 加载 .env
  167. if [ -f .env ]; then
  168. set -a
  169. source .env
  170. set +a
  171. fi
  172. CONFIG_FILE="${1:-agent-config.yml}"
  173. if [ ! -f "$CONFIG_FILE" ]; then
  174. fail "Agent 配置文件不存在: $CONFIG_FILE\n 请创建配置文件或指定路径: ./setup.sh --launch your-config.yml"
  175. fi
  176. info "一键启动 Agent: $CONFIG_FILE"
  177. python -m agentpaas launch "$CONFIG_FILE"
  178. }
  179. # ── 主流程 ────────────────────────────────────────────────
  180. main() {
  181. echo ""
  182. echo "================================================"
  183. echo " LambdAgent PaaS 一键安装启动"
  184. echo "================================================"
  185. echo ""
  186. case "${1:-}" in
  187. --help|-h)
  188. show_help
  189. exit 0
  190. ;;
  191. --docker)
  192. start_docker
  193. ;;
  194. --install)
  195. check_python
  196. setup_env
  197. install_deps
  198. echo "安装完成! 启动服务请运行:"
  199. echo " source .venv/bin/activate"
  200. echo " python -m agentpaas serve --dev"
  201. ;;
  202. --launch)
  203. check_python
  204. setup_env
  205. install_deps
  206. launch_agent "${2:-}"
  207. ;;
  208. *)
  209. check_python
  210. setup_env
  211. install_deps
  212. start_python
  213. ;;
  214. esac
  215. }
  216. main "$@"