From ded45063d9c68c1f104710265c5f61b736185270 Mon Sep 17 00:00:00 2001 From: wangbo Date: Fri, 20 Mar 2026 17:06:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20Agent=20=E8=AE=B0?= =?UTF-8?q?=E5=BF=86=E6=9C=8D=E5=8A=A1=E9=83=A8=E7=BD=B2=E3=80=81=E9=87=8D?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E5=AE=B9=E5=99=A8=E3=80=81=E6=95=B4=E7=90=86?= =?UTF-8?q?=20env=20=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 agent-memory 服务与 .env.AMS.sample - easyai-pgvector 共用 PostgreSQL,独立库 easyai_memory - 新增 docker/postgres/init-pgvector.sql 初始化 - 容器名: comfyAI-web→easyai-web, comfy-server→easyai-server - easyai-asg-pg→easyai-pgvector - 记忆服务端口配置移至 .env(comfy-server 调用用) - 整理 .env.sample 结构,新增 /ams-api/ Nginx 代理 Made-with: Cursor --- .env.AMS.sample | 40 ++++++++++ .env.ASG.sample | 3 +- .env.sample | 118 +++++++++++++++--------------- README.md | 82 ++++++++++++++++++++- docker-compose.yml | 50 +++++++++++-- docker/postgres/init-pgvector.sql | 14 ++++ easyai-proxy.conf.sample | 13 ++++ 7 files changed, 247 insertions(+), 73 deletions(-) create mode 100644 .env.AMS.sample create mode 100644 docker/postgres/init-pgvector.sql diff --git a/.env.AMS.sample b/.env.AMS.sample new file mode 100644 index 0000000..72385e3 --- /dev/null +++ b/.env.AMS.sample @@ -0,0 +1,40 @@ +# ============================================ +# Agent 记忆服务(agent-memory)环境变量 +# 使用前请复制为 .env.AMS 并根据实际情况修改 +# ============================================ + +# ---------- PostgreSQL(复用 easyai-pgvector)---------- +# 使用独立库 easyai_memory(init 脚本在首次启动时创建) +# agent-memory 启动时执行 prisma migrate deploy 创建 memory_records 等表 +MEMORY_DATABASE_URL=postgresql://easyai:easyai2025@easyai-pgvector:5432/easyai_memory?schema=public + +# ---------- 主服务连接(用于 Embedding 与对话压缩)---------- +# 主服务 API 地址(容器内网地址) +MEMORY_AI_BASE_URL=http://comfy-server:3001 +MEMORY_AI_API_KEY= + +# ---------- Embeddings ---------- +MEMORY_EMBEDDINGS_PATH=/v1/embeddings +MEMORY_EMBEDDING_MODELS_PATH=/v1/embeddings/models +MEMORY_EMBEDDING_DIMENSION=1024 +MEMORY_EMBEDDING_MODEL=text-embedding-v4 +MEMORY_SCORE_CONFIDENCE_BASE=0.6 +MEMORY_SCORE_CONFIDENCE_GAIN=0.4 +MEMORY_SCORE_IMPORTANCE_BASE=0.7 +MEMORY_SCORE_IMPORTANCE_GAIN=0.3 + +# ---------- 对话压缩 ---------- +MEMORY_CHAT_COMPLETIONS_PATH=/v1/chat/completions +MEMORY_CHAT_MODELS_PATH=/v1/models +MEMORY_CHAT_MODEL= +MEMORY_COMPRESSION_ENABLED=true +MEMORY_COMPRESSION_MIN_LENGTH=80 + +# ---------- 其他 ---------- +# 日志级别 +LOG_LEVEL=log,error,warn,debug +# 是否禁用 Swagger 文档(true 禁用) +MEMORY_DOCS_DISABLE=false + +# 记忆服务镜像版本 +AMS_VERSION=latest diff --git a/.env.ASG.sample b/.env.ASG.sample index a9a91ec..c77a677 100644 --- a/.env.ASG.sample +++ b/.env.ASG.sample @@ -5,9 +5,8 @@ # ---------- PostgreSQL ---------- # Prisma 数据库连接字符串(容器内网地址) -ASG_DATABASE_URL=postgresql://easyai:easyai2025@easyai-asg-pg:5432/agent_governance?schema=public +ASG_DATABASE_URL=postgresql://easyai:easyai2025@easyai-pgvector:5432/agent_governance?schema=public -# PostgreSQL 容器初始化配置(与 docker-compose 中 sg-postgres 保持一致) ASG_POSTGRES_USER=easyai ASG_POSTGRES_PASSWORD=easyai2025 ASG_POSTGRES_DB=agent_governance diff --git a/.env.sample b/.env.sample index bbeaf88..2d0691b 100644 --- a/.env.sample +++ b/.env.sample @@ -1,70 +1,66 @@ ############################################# -#1、如下配置需要根据实际情况进行配置 -############################################## -# 默认服务器地址,本地不需要更改,云服务需要修改为云端IP,并放行对应端口 TODO +# EasyAI 环境变量配置 +# 复制为 .env 并根据实际情况修改 +############################################# + +# ========== 1. 访问地址(部署时必改) ========== +# 默认服务器 API 地址,云服务需修改为云端 IP 并放行对应端口 NUXT_PUBLIC_BASE_APIURL=http://127.0.0.1:3001 -#域名访问使用如下配置,使用/api进行转发,并配置nginx代理/api至3001端口 -#NUXT_PUBLIC_BASE_APIURL=/api -# 默认的服务器websocket地址,本地不需要更改,云服务需要修改为云端IP,并放行对应端口 TODO +# 域名访问:NUXT_PUBLIC_BASE_APIURL=/api + +# 默认 WebSocket 地址 NUXT_PUBLIC_BASE_SOCKETURL=ws://127.0.0.1:3002 -#域名访问使用如下配置,配置为/,并代理/socket.io请求到3002端口 -#NUXT_PUBLIC_BASE_SOCKETURL=wss://yourwebsite.com/socket.io -# Agent 服务治理 API 地址,前端管理页面需要。IP访问填http://:3003,域名访问填/asg-api +# 域名访问:NUXT_PUBLIC_BASE_SOCKETURL=wss://yourwebsite.com/socket.io + +# Agent 服务治理 API 地址,前端管理页面需要 NUXT_PUBLIC_SG_APIURL=http://127.0.0.1:3003 -#域名访问使用如下配置,通过nginx代理转发 -#NUXT_PUBLIC_SG_APIURL=/asg-api +# 域名访问:NUXT_PUBLIC_SG_APIURL=/asg-api -############################################# -#2、以下部分可保持默认,如果没有端口冲突,生产环境可修改密码 -############################################## -#comfyAI-web 前端应用暴露端口,访问地址ip:3010访问,初始化管理员账号admin,密码123456 +# ========== 2. 服务端口 ========== WEB_PORT=3010 -#支持静态资源CDN,将静态资源从服务器分离 -NUXT_APP_CDN_URL= +# easyai-web 前端端口,访问地址 ip:3010,初始化管理员 admin/123456 + +SERVER_HTTP_PORT=3001 +SERVER_WS_PORT=3002 +# easyai-server 后端 HTTP / WebSocket 端口 -#视频编辑对外暴露端口 VIDEO_EDIT_PORT=8000 +# 视频编辑服务对外端口 -#沙箱环境对外端口,不建议暴露,如果需要暴露,取消docker-compose.yml中的对应注释 +AMS_PORT=3004 +# Agent 记忆服务 HTTP 端口(启用 memory profile 时) + +# ========== 3. Agent 记忆服务(启用 memory profile 时) ========== +MEMORY_TCP_HOST=agent-memory +MEMORY_TCP_PORT=4004 +# easyai-server 调用 agent-memory 的 TCP 连接 + +# ========== 4. 沙箱环境 ========== SANDBOX_PORT=8081 -#SANDBOX jupyterlab 端口 +# 不建议对外暴露 + SANDBOX_JUPYTERLAB_PORT=8888 -# 配置Jupter的token,安全考虑,建议设置 SANDBOX_JUPYTER_TOKEN=easyaiisbest +# 建议设置 token + SANDBOX_SERVICE_BASE_URL= - - -#REDIS暴露端口,默认不暴露 +# ========== 5. Redis ========== REDIS_PORT= +# 默认不对外暴露 CONFIG_COMFYUI_QUENE_REDIS_USERNAME= CONFIG_COMFYUI_QUENE_REDIS_PASSWORD= -#队列使用的DB CONFIG_COMFYUI_QUENE_REDIS_DB=6 -#普通缓存使用的DB CONFIG_COMFYUI_CACHE_REDIS_DB=11 -#MONGO 暴露端口,默认不暴露。用户名密码初次部署可以修改,更新请勿修改 +# ========== 6. MongoDB ========== MONGO_PORT=27017 MONGO_INITDB_ROOT_USERNAME=username MONGO_INITDB_ROOT_PASSWORD=password -#comfy-server后端web服务暴露端口。一般情况下无需修改 -SERVER_HTTP_PORT=3001 -SERVER_WS_PORT=3002 -#watchtower 监听端口,自动更新容器和通过浏览器查看容器日志 -WATCHTOWER_PORT=8089 -PORTAINER_PORT=8090 -PORTAINER_HTTPS_PORT=8091 +# 初次部署可修改,更新请勿修改 -#网络代理,链接gpt等需要设置 -CONFIG_PROXY_URL= - - -#实例ID、集群情况下区分不同客户端 -CONFIG_INSTANCE_ID=2025 - -#消息队列 +# ========== 7. 消息队列 RabbitMQ ========== CONFIG_MQ_PROTOCOL=amqp CONFIG_MQ_USER=admin CONFIG_MQ_PASSWORD=easyai2025 @@ -73,33 +69,35 @@ CONFIG_MQ_PORT=5672 CONFIG_MQ_ADMIN_PORT=15672 CONFIG_MQ_VHOST=/ -#版本 -VERSION=latest -#日志与调试 -LOG_LEVEL=log,error,warn,debug -#Token过期时间,单位秒 +# ========== 8. 鉴权与安全 ========== CONFIG_TOKEN_EXPIRE=1800 -# token加密密钥,可以修改为任意字符串 CONFIG_JWT_SECRET='this is a very secret secret' CONFIG_TOKEN_SIGN_SK=easyai2025easyai +# ========== 9. 运维与调试 ========== +CONFIG_INSTANCE_ID=2025 +# 集群情况下区分不同客户端 -#minio -#MINIO_ROOT_USER=minioadmin -#MINIO_ROOT_PASSWORD=minioadmin +CONFIG_PROXY_URL= +# 连接 GPT 等外部服务时设置 -# VideoEdit OSS 配置(PDF 解析图片上传,填写 .env.tools 或在此覆盖) +LOG_LEVEL=log,error,warn,debug + +WATCHTOWER_PORT=8089 +PORTAINER_PORT=8090 +PORTAINER_HTTPS_PORT=8091 + +# ========== 10. 静态资源 CDN(可选) ========== +NUXT_APP_CDN_URL= + +# ========== 11. 版本 ========== +VERSION=latest + +# ========== 12. OSS 配置(可选,PDF 解析图片上传) ========== +# 可填写 .env.tools 或在此覆盖 # OSS_ENDPOINT= # OSS_ACCESS_KEY_ID= # OSS_ACCESS_KEY_SECRET= # OSS_BUCKET= # OSS_REGION=us-east-1 # OSS_DOMAIN= - - - - - - - - diff --git a/README.md b/README.md index 5f23d71..7753698 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,84 @@ git clone https://git.51easyai.com/wangbo/easyai.git; cd easyai; powershell -Exe ## 重要更新记录: +### 2026.3.20 + +1. **新增 Agent 记忆服务(AMS)模块**:新增 `agent-memory`(Agent 长期记忆)容器,复用 `easyai-pgvector` 数据库(需 pgvector 扩展),用于支持 Agent 对话记忆、向量召回与反馈能力。 +2. **新增环境变量文件**:新增 `.env.AMS.sample` 文件,包含记忆服务所需的全部环境变量。 +3. 主服务 `comfy-server` 新增 `MEMORY_TCP_HOST` 和 `MEMORY_TCP_PORT` 环境变量,用于内部 TCP 微服务通信。 +4. **Nginx 代理**:`easyai-proxy.conf.sample` 中新增 `/ams-api/` 路径代理(可选)。 + +#### 升级步骤 + +**步骤一:更新文件** + +将以下文件更新到最新版本: +- `docker-compose.yml` +- `easyai-proxy.conf.sample` +- `docker/postgres/init-pgvector.sql`(PostgreSQL 首次启动时创建 vector 扩展) + +新增文件复制到部署目录: +- `.env.AMS.sample` → 复制为 `.env.AMS` 并根据实际环境修改 + +**步骤二:配置 `.env.AMS`** + +```bash +cp .env.AMS.sample .env.AMS +``` + +根据实际环境修改 `.env.AMS` 中的关键配置: +```dotenv +# PostgreSQL 连接(独立库 easyai_memory,与 .env.ASG 中账号密码一致) +MEMORY_DATABASE_URL=postgresql://easyai:easyai2025@easyai-pgvector:5432/easyai_memory?schema=public + +# 主服务 API 地址(用于 Embedding 与对话压缩) +MEMORY_AI_BASE_URL=http://comfy-server:3001 + +# Embedding 模型与维度(需与主服务一致) +MEMORY_EMBEDDING_DIMENSION=1024 +MEMORY_EMBEDDING_MODEL=text-embedding-v4 +``` + +**步骤三:启动服务** + +记忆服务使用 Docker Compose Profile,需显式启用: + +```bash +cd ~/easyai +# 启动全部服务(含记忆服务) +docker compose --profile memory up -d + +# 或仅启动基础服务(不含记忆) +docker compose up -d +``` + +新增容器:`agent-memory`(Agent 记忆服务),复用 `easyai-pgvector`,使用独立库 `easyai_memory`。初始化流程与 ASG 一致: +- **PostgreSQL 首次启动**:`docker/postgres/init-pgvector.sql` 创建 `vector`、`pgcrypto` 扩展 +- **easyai-asg 启动**:entrypoint 执行 `prisma migrate deploy`,创建治理相关表 +- **agent-memory 启动**:entrypoint 执行 `prisma migrate deploy`,创建 `memory_records` 等表 + +**注意**:`easyai-pgvector` 使用 `registry.cn-shanghai.aliyuncs.com/easyaigc/pgvector:0.8.2-pg18-trixie`(含 pgvector 扩展)。若此前使用其他镜像且已有数据,升级前请备份 `asg_postgres_data` 卷。 + +**步骤四:验证** + +```bash +# 检查容器状态 +docker compose ps agent-memory + +# 检查记忆服务健康状态 +curl http://127.0.0.1:3004/health + +# 通过 Nginx 代理访问(配置 Nginx 后) +curl https://<你的域名>/ams-api/health +``` + +> **注意**:记忆服务默认不启动,使用 `docker compose --profile memory up -d` 显式启用。若不需要 Agent 记忆功能,保持 `docker compose up -d` 即可,主服务会正常运行(记忆相关能力不可用)。 + +--- ### 2026.3.2 -1. **新增 Agent 服务治理(ASG)模块**:新增 `easyai-asg`(Agent 服务治理)容器和独立的 `easyai-asg-pg`(PostgreSQL 18)数据库容器,用于支持 Agent 自动化治理能力。 +1. **新增 Agent 服务治理(ASG)模块**:新增 `easyai-asg`(Agent 服务治理)容器和独立的 `easyai-pgvector`(PostgreSQL 18)数据库容器,用于支持 Agent 自动化治理能力。 2. **新增 Nginx 反向代理**:在 `easyai-proxy.conf.sample` 中新增 `/asg-api/` 路径代理,用于暴露 ASG 服务的 REST API。 3. **新增环境变量文件**:新增 `.env.ASG.sample` 文件,包含 ASG 服务所需的全部环境变量。 4. 主服务 `comfy-server` 新增 `ASG_TCP_HOST` 和 `ASG_TCP_PORT` 环境变量,用于内部 TCP 微服务通信。 @@ -61,7 +135,7 @@ cp .env.ASG.sample .env.ASG 根据实际环境修改 `.env.ASG` 中的关键配置: ```dotenv # PostgreSQL 连接(默认使用容器内网地址,一般无需修改) -ASG_DATABASE_URL=postgresql://easyai:easyai2025@easyai-asg-pg:5432/agent_governance?schema=public +ASG_DATABASE_URL=postgresql://easyai:easyai2025@easyai-pgvector:5432/agent_governance?schema=public ASG_POSTGRES_USER=easyai ASG_POSTGRES_PASSWORD=easyai2025 @@ -105,13 +179,13 @@ cd ~/easyai docker compose up -d ``` -新增容器:`easyai-asg-pg`(PostgreSQL)和 `easyai-asg`(Agent 服务治理),数据库会在首次启动时自动完成初始化和迁移。 +新增容器:`easyai-pgvector`(PostgreSQL)和 `easyai-asg`(Agent 服务治理),数据库会在首次启动时自动完成初始化和迁移。 **步骤五:验证** ```bash # 检查容器状态 -docker compose ps easyai-asg-pg easyai-asg +docker compose ps easyai-pgvector easyai-asg # 检查 ASG 服务健康状态 curl http://127.0.0.1:3003/health diff --git a/docker-compose.yml b/docker-compose.yml index e8907dc..3c1ef8d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ #version: '3' services: comfyAI-web: - container_name: comfyAI-web + container_name: easyai-web #更新修改冒号后面的版本号 image: registry.cn-shanghai.aliyuncs.com/comfy-ai/one-ai:${VERSION} #端口冲突时,只需要修改前面的端口比如修改为,3011:3010 @@ -47,7 +47,7 @@ services: reservations: memory: 600MB comfy-server: - container_name: comfy-server + container_name: easyai-server # 阿里云镜像地址 image: registry.cn-shanghai.aliyuncs.com/comfy-ai/comfy-server:${VERSION} # 阿里云 labels: @@ -108,6 +108,9 @@ services: # 服务治理 TCP 连接 - ASG_TCP_HOST=easyai-asg - ASG_TCP_PORT=4003 + # Agent 记忆服务 TCP 连接(来自 .env) + - MEMORY_TCP_HOST=${MEMORY_TCP_HOST:-agent-memory} + - MEMORY_TCP_PORT=${MEMORY_TCP_PORT:-4004} # 日志大小设置,避免日志文件过大 env_file: - .env @@ -350,17 +353,19 @@ services: timeout: 10s retries: 3 start_period: 10s - easyai-asg-pg: - image: registry.cn-shanghai.aliyuncs.com/easyaigc/postgres:18-alpine - container_name: easyai-asg-pg + easyai-pgvector: + # 使用带 pgvector 的镜像,供 ASG 与 Agent 记忆服务共用 + image: registry.cn-shanghai.aliyuncs.com/easyaigc/pgvector:0.8.2-pg18-trixie + container_name: easyai-pgvector restart: unless-stopped environment: POSTGRES_USER: ${ASG_POSTGRES_USER:-easyai} POSTGRES_PASSWORD: ${ASG_POSTGRES_PASSWORD:-easyai2025} POSTGRES_DB: ${ASG_POSTGRES_DB:-agent_governance} volumes: - # PG 18+ 数据目录改为 /var/lib/postgresql/18/docker,需挂载父目录 /var/lib/postgresql - asg_postgres_data:/var/lib/postgresql + # 首次启动时执行,创建 pgvector 扩展供记忆服务使用 + - ./docker/postgres/init-pgvector.sql:/docker-entrypoint-initdb.d/02-init-pgvector.sql networks: comfyai: ipv4_address: 172.21.0.13 @@ -386,7 +391,7 @@ services: comfyai: ipv4_address: 172.21.0.14 depends_on: - easyai-asg-pg: + easyai-pgvector: condition: service_healthy redis: condition: service_started @@ -406,6 +411,37 @@ services: memory: 512MB reservations: memory: 128MB + agent-memory: + profiles: + - memory + container_name: agent-memory + image: registry.cn-shanghai.aliyuncs.com/easyaigc/agent-memory:${AMS_VERSION:-latest} + labels: + - "com.centurylinklabs.watchtower.enable=true" + ports: + - "${AMS_PORT:-3004}:3004" + networks: + comfyai: + ipv4_address: 172.21.0.16 + depends_on: + easyai-pgvector: + condition: service_healthy + comfy-server: + condition: service_started + restart: unless-stopped + env_file: + - .env.AMS + logging: + driver: "json-file" + options: + max-size: "100m" + max-file: "10" + deploy: + resources: + limits: + memory: 512MB + reservations: + memory: 128MB # portainer: # image: registry.cn-shanghai.aliyuncs.com/comfy-ai/portainer-ce:2.21.5 # container_name: portainer diff --git a/docker/postgres/init-pgvector.sql b/docker/postgres/init-pgvector.sql new file mode 100644 index 0000000..e4dd161 --- /dev/null +++ b/docker/postgres/init-pgvector.sql @@ -0,0 +1,14 @@ +-- 首次启动时执行,与 ASG 共用同一 PostgreSQL 实例 +-- 1. 为 agent_governance 启用 pgvector(兼容共库场景) +\c agent_governance +CREATE EXTENSION IF NOT EXISTS vector; +CREATE EXTENSION IF NOT EXISTS pgcrypto; + +-- 2. 创建记忆服务独立数据库 easyai_memory +CREATE DATABASE easyai_memory; +GRANT ALL PRIVILEGES ON DATABASE easyai_memory TO easyai; + +-- 3. 为 easyai_memory 启用 pgvector +\c easyai_memory +CREATE EXTENSION IF NOT EXISTS vector; +CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/easyai-proxy.conf.sample b/easyai-proxy.conf.sample index fbec653..83fe8f0 100644 --- a/easyai-proxy.conf.sample +++ b/easyai-proxy.conf.sample @@ -91,6 +91,19 @@ server { proxy_set_header Host $host; } + # Agent 记忆服务 API(可选,用于健康检查或外部调用) + location /ams-api/ { + proxy_pass http://127.0.0.1:3004/; + proxy_read_timeout 300s; + client_max_body_size 20M; + proxy_redirect off; + proxy_set_header X-Original-Prefix '/ams-api'; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $host; + } + location /plugins/ { proxy_pass http://127.0.0.1:3020/plugins/; proxy_redirect off;