Docs/installation tutorial (#7)
* [add]修改迁移文件新建空白表结构 * Add installation guide and environment setup Added installation instructions and environment requirements for MemoryBear. * [delete]删除api,web的readme.md。只保留唯一readme.md * Fix database connection example in README Update database connection configuration example in README.
This commit is contained in:
236
README.md
236
README.md
@@ -1,5 +1,5 @@
|
||||
# MemoryBear 让AI拥有如同人类一样的记忆
|
||||
|
||||
### [安装教程](#memorybear安装教程)
|
||||
## 项目简介
|
||||
MemoryBear是红熊AI自主研发的新一代AI记忆系统,其核心突破在于跳出传统知识“静态存储”的局限,以生物大脑认知机制为原型,构建了具备“感知-提炼-关联-遗忘”全生命周期的智能知识处理体系。该系统致力于让机器摆脱“信息堆砌”的困境,实现对知识的深度理解与自主进化,成为人类认知协作的核心伙伴。
|
||||
|
||||
@@ -71,6 +71,240 @@ Memory Bear 基于向量的知识记忆非图谱版本,成功在保持高准
|
||||
Memory Bear 通过集成知识图谱架构,在需要复杂推理和关系感知的任务上进一步释放了潜力。虽然图谱的遍历和推理可能会引入轻微的检索开销,但该版本通过优化图检索策略和决策流,成功将延迟控制在高效范围。更关键的是,基于图谱的 Memory Bear 将总体准确性推至新的高度(75.00 ± 0.20%),在保持准确性的同时,整体指标显著优于其他所有方法,证明了“结构化记忆带来的性能决定性优势”。
|
||||
<img width="2238" height="342" alt="image" src="https://github.com/user-attachments/assets/c928e094-45a2-414b-831a-6990b711ed07" />
|
||||
|
||||
# MemoryBear安装教程
|
||||
## 一、前期准备
|
||||
|
||||
### 1.环境要求
|
||||
|
||||
* Node.js 20.19+ 或 22.12+ 前端运行环境
|
||||
|
||||
* Python 3.12 后端运行环境
|
||||
|
||||
* PostgreSQL 13+ 主数据库
|
||||
|
||||
* Neo4j 4.4+ 图数据库(存储知识图谱)
|
||||
|
||||
* Redis 6.0+ 缓存和消息队列
|
||||
|
||||
## 二、项目获取
|
||||
|
||||
### 1.获取方式
|
||||
|
||||
Git克隆(推荐):
|
||||
|
||||
```plain text
|
||||
git clone https://github.com/SuanmoSuanyangTechnology/MemoryBear.git
|
||||
```
|
||||
|
||||
### 2.目录说明
|
||||
|
||||
<img width="5238" height="1626" alt="diagram" src="https://github.com/user-attachments/assets/416d6079-3f34-40c3-9bcf-8760d186741a" />
|
||||
|
||||
|
||||
## 三、安装步骤
|
||||
|
||||
### 1.后端API服务启动
|
||||
|
||||
#### 1.1 安装python依赖
|
||||
|
||||
```python
|
||||
# 0.安装依赖管理工具uv
|
||||
pip install uv
|
||||
|
||||
# 1.终端切换API目录
|
||||
cd api
|
||||
|
||||
# 2.安装依赖
|
||||
uv sync
|
||||
|
||||
# 3.激活虚拟环境 (Windows)
|
||||
.venv\Scripts\Activate.ps1 (powershell,在api目录下)
|
||||
api\.venv\Scripts\activate (powershell,在根目录下)
|
||||
.venv\Scripts\activate.bat (cmd,在api目录下)
|
||||
|
||||
```
|
||||
|
||||
#### 1.2 安装必备基础服务(docker镜像)
|
||||
|
||||
使用docker desktop安装所需的docker镜像
|
||||
|
||||
* **docker desktop安装地址:**https://www.docker.com/products/docker-desktop/
|
||||
|
||||
* **PostgreSQL**
|
||||
|
||||
**拉取镜像**
|
||||
|
||||
search——select——pull
|
||||
|
||||
<img width="1280" height="731" alt="image-9" src="https://github.com/user-attachments/assets/0609eb5f-e259-4f24-8a7b-e354da6bae4d" />
|
||||
|
||||
|
||||
**创建容器**
|
||||
|
||||
<img width="1280" height="731" alt="image-8" src="https://github.com/user-attachments/assets/d57b3206-1df1-42a4-80fd-e71f37201a25" />
|
||||
|
||||
|
||||
**服务启动成功**
|
||||
|
||||
<img width="1280" height="731" alt="image" src="https://github.com/user-attachments/assets/76e04c54-7a36-46ec-a68e-241ad268e427" />
|
||||
|
||||
|
||||
* **Neo4j**
|
||||
|
||||
**拉取镜像**,与PostgreSQL一样从docker desktop中拉取镜像
|
||||
|
||||
**创建容器**,Neo4j 默认需要映射**2 个关键端口**(7474 对应 Browser,7687 对应 Bolt 协议),同时需设置初始密码
|
||||
|
||||
<img width="1280" height="731" alt="image-1" src="https://github.com/user-attachments/assets/6bfb0c27-74e8-45f7-b381-189325d516bd" />
|
||||
|
||||
|
||||
**服务成功启动**
|
||||
|
||||
<img width="1280" height="731" alt="image-2" src="https://github.com/user-attachments/assets/0d28b4fa-e8ed-4c05-8983-7a47f0a892d1" />
|
||||
|
||||
|
||||
* **Redis**
|
||||
|
||||
同上
|
||||
|
||||
#### 1.3 配置环境变量
|
||||
|
||||
复制 env.example 为 .env 并填写配置
|
||||
|
||||
```bash
|
||||
# Neo4j 图数据库
|
||||
NEO4J_URI=bolt://localhost:7687
|
||||
NEO4J_USERNAME=neo4j
|
||||
NEO4J_PASSWORD=your-password
|
||||
# Neo4j Browser访问地址
|
||||
|
||||
# PostgreSQL 数据库
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=5432
|
||||
DB_USER=postgres
|
||||
DB_PASSWORD=your-password
|
||||
DB_NAME=redbear-mem
|
||||
|
||||
# Database Migration Configuration
|
||||
# Set to true to automatically upgrade database schema on startup
|
||||
DB_AUTO_UPGRADE=true # 首次启动设为true自动迁移数据库 在空白数据库创建表结构
|
||||
|
||||
# Redis
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PORT=6379
|
||||
REDIS_DB=1
|
||||
|
||||
# Celery (使用Redis作为broker)
|
||||
BROKER_URL=redis://127.0.0.1:6379/0
|
||||
RESULT_BACKEND=redis://127.0.0.1:6379/0
|
||||
|
||||
# JWT密钥 (生成方式: openssl rand -hex 32)
|
||||
SECRET_KEY=your-secret-key-here
|
||||
```
|
||||
|
||||
#### 1.4 PostgreSQL数据库建立
|
||||
|
||||
通过项目中已有的 alembic 数据库迁移文件,为全新创建的空白 PostgreSQL 数据库创建对应的表结构。
|
||||
|
||||
**(1)配置数据库连接**
|
||||
|
||||
确认项目中`alembic.ini`文件的`sqlalchemy.url`配置指向你的空白 PostgreSQL 数据库,格式示例:
|
||||
|
||||
```
|
||||
sqlalchemy.url = postgresql://用户名:密码@数据库地址:端口/空白数据库名
|
||||
```
|
||||
|
||||
同时检查 migrations`/env.py`中`target_metadata`是否正确关联到 ORM 模型的`metadata`(确保迁移脚本和模型一致)
|
||||
|
||||
**(2)执行迁移文件**
|
||||
|
||||
在API目录执行以下命令,alembic 会自动识别空白数据库,并执行所有未应用的迁移脚本,创建完整表结构:
|
||||
|
||||
```bash
|
||||
alembic upgrade head
|
||||
```
|
||||
|
||||
<img width="1076" height="341" alt="image-3" src="https://github.com/user-attachments/assets/9edda79d-4637-46e3-bee3-2eec39975d59" />
|
||||
|
||||
|
||||
通过Navicat查看迁移创建的数据库表结构
|
||||
|
||||
<img width="1280" height="680" alt="image-4" src="https://github.com/user-attachments/assets/aa5c1d98-bdc3-4d25-acb2-5c8cf6ecd3f5" />
|
||||
|
||||
|
||||
#### API服务启动
|
||||
|
||||
```python
|
||||
uv run -m app.main
|
||||
```
|
||||
|
||||
访问 API 文档:http://localhost:8000/docs
|
||||
|
||||
<img width="1280" height="675" alt="image-5" src="https://github.com/user-attachments/assets/68fa62b4-2c4f-4cf0-896c-41d59aa7d712" />
|
||||
|
||||
|
||||
### 2.前端web应用启动
|
||||
|
||||
#### 2.1安装依赖
|
||||
|
||||
```python
|
||||
# 切换web目录下
|
||||
cd web
|
||||
|
||||
# 下载依赖
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 2.2 修改API代理配置
|
||||
|
||||
编辑 web/vite.config.ts,将代理目标改为后端地址
|
||||
|
||||
```python
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://127.0.0.1:8000', // 改为后端地址,win用户127.0.0.1 mac用户0.0.0.0
|
||||
changeOrigin: true,
|
||||
},
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
#### 2.3 启动服务
|
||||
|
||||
```python
|
||||
# 启动web服务
|
||||
npm run dev
|
||||
|
||||
```
|
||||
|
||||
服务启动会输出可访问的前端界面
|
||||
|
||||
<img width="935" height="311" alt="image-6" src="https://github.com/user-attachments/assets/cba1074a-440c-4866-8a94-7b6d1c911a93" />
|
||||
|
||||
|
||||
<img width="1280" height="652" alt="image-7" src="https://github.com/user-attachments/assets/a719dc0a-cbdd-4ba1-9b21-123d5eac32eb" />
|
||||
|
||||
|
||||
## 四、用户操作
|
||||
|
||||
step1:项目获取
|
||||
|
||||
step2:后端API服务启动
|
||||
|
||||
step3:前端web应用启动
|
||||
|
||||
step4: 终端输入 curl.exe -X POST http://127.0.0.1:8000/api/setup ,访问接口初始化数据库获得超级管理员账号
|
||||
|
||||
step5:超级管理员 
|
||||
|
||||
账号:admin@example.com
|
||||
|
||||
密码:admin\_password
|
||||
|
||||
step6:登陆前端页面
|
||||
|
||||
|
||||
|
||||
|
||||
## 许可证
|
||||
|
||||
|
||||
124
api/README.md
124
api/README.md
@@ -1,124 +0,0 @@
|
||||
# Memory Bear 前端项目
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 环境要求
|
||||
|
||||
- Python 3.12
|
||||
- PostgreSQL 13+
|
||||
- Neo4j 4.4+
|
||||
- Redis 6.0+
|
||||
|
||||
### 安装依赖
|
||||
|
||||
```bash
|
||||
python -m venv .venv
|
||||
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
||||
|
||||
# 方式一:基于 pyproject 安装
|
||||
pip install .
|
||||
|
||||
# 方式二:使用 requirements.txt
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 配置环境变量
|
||||
|
||||
创建 `.env` 文件(示例):
|
||||
|
||||
```env
|
||||
# Postgres
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=5432
|
||||
DB_USER=postgres
|
||||
DB_PASSWORD=your-password
|
||||
DB_NAME=redbear-mem
|
||||
DB_AUTO_UPGRADE=false
|
||||
|
||||
# Neo4j
|
||||
NEO4J_URI=bolt://localhost:7687
|
||||
NEO4J_USERNAME=neo4j
|
||||
NEO4J_PASSWORD=your-password
|
||||
|
||||
# Redis
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PORT=6379
|
||||
REDIS_DB=1
|
||||
|
||||
# LLM / API Keys(按需)
|
||||
OPENAI_API_KEY=your-openai-key
|
||||
DASHSCOPE_API_KEY=your-dashscope-key
|
||||
|
||||
# 其他
|
||||
WEB_URL=http://localhost:3000
|
||||
LOG_LEVEL=INFO
|
||||
```
|
||||
|
||||
### 初始化与启动
|
||||
|
||||
```bash
|
||||
# 如需自动迁移数据库:设置 DB_AUTO_UPGRADE=true 或手动执行
|
||||
alembic upgrade head
|
||||
|
||||
# 激活虚拟环境
|
||||
api\.venv\Scripts\activate
|
||||
|
||||
# 目录切换到api下
|
||||
cd api
|
||||
|
||||
|
||||
# 启动开发服务
|
||||
uvicorn app.main:app --reload --port 8000
|
||||
|
||||
# 打开交互文档
|
||||
# http://localhost:8000/docs
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
app/
|
||||
├── main.py # FastAPI 入口
|
||||
├── controllers/ # 控制器与路由
|
||||
├── core/ # 核心:配置、异常、日志等
|
||||
│ └── memory/ # 记忆模块
|
||||
│ ├── storage_services/ # 萃取/遗忘/反思/检索
|
||||
│ ├── agent/ # Agent + MCP 服务
|
||||
│ ├── utils/ # 工具与提示词
|
||||
│ └── models/ # 领域模型
|
||||
└── rag/ # RAG 能力与文档解析
|
||||
|
||||
logs/ # 日志与输出
|
||||
LICENSE # 许可协议(Apache-2.0)
|
||||
README.md # 项目说明
|
||||
```
|
||||
|
||||
## API 与路由
|
||||
|
||||
- 管理端:`/api`(JWT 认证)
|
||||
- 服务端:`/v1`(API Key 认证)
|
||||
- 根路由健康检查:`GET /` 返回运行状态
|
||||
- Swagger 文档:`/docs`
|
||||
|
||||
|
||||
## 部署建议
|
||||
|
||||
- 使用 `gunicorn` + `uvicorn.workers.UvicornWorker` 作为生产入口
|
||||
- 配置 `LOG_LEVEL=WARNING` 并启用文件日志
|
||||
- 数据库与缓存请使用托管服务或独立实例
|
||||
|
||||
示例:
|
||||
|
||||
```bash
|
||||
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker
|
||||
```
|
||||
|
||||
## 许可证
|
||||
|
||||
本项目采用 Apache License 2.0 开源协议,详情见 `LICENSE`。
|
||||
|
||||
## 致谢与交流
|
||||
|
||||
- 问题反馈与讨论:请提交 Issue 到代码仓库
|
||||
- 欢迎贡献:提交 PR 前请先创建功能分支并遵循常规提交信息格式
|
||||
- 如感兴趣需要联络:tianyou_hubm@redbearai.com
|
||||
@@ -14,7 +14,7 @@ DB_NAME=
|
||||
|
||||
# Database Migration Configuration
|
||||
# Set to true to automatically upgrade database schema on startup
|
||||
DB_AUTO_UPGRADE=false
|
||||
DB_AUTO_UPGRADE=true
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ def upgrade() -> None:
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index(op.f('ix_app_shares_id'), 'app_shares', ['id'], unique=False)
|
||||
op.drop_table('data_config')
|
||||
op.execute('DROP TABLE IF EXISTS data_config')
|
||||
op.add_column('conversations', sa.Column('workspace_id', sa.UUID(), nullable=False, comment='工作空间ID'))
|
||||
op.create_foreign_key(None, 'conversations', 'workspaces', ['workspace_id'], ['id'])
|
||||
# ### end Alembic commands ###
|
||||
|
||||
@@ -47,7 +47,7 @@ def upgrade() -> None:
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
op.create_index(op.f('ix_messages_id'), 'messages', ['id'], unique=False)
|
||||
op.drop_table('data_config')
|
||||
op.execute('DROP TABLE IF EXISTS data_config')
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
|
||||
@@ -20,11 +20,31 @@ depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column('data_config', sa.Column('llm', sa.String(), nullable=True, comment='LLM模型配置ID'))
|
||||
# 检查表是否存在再添加列
|
||||
op.execute("""
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'data_config')
|
||||
AND NOT EXISTS (SELECT FROM information_schema.columns
|
||||
WHERE table_name = 'data_config' AND column_name = 'llm') THEN
|
||||
ALTER TABLE data_config ADD COLUMN llm VARCHAR;
|
||||
COMMENT ON COLUMN data_config.llm IS 'LLM模型配置ID';
|
||||
END IF;
|
||||
END $$;
|
||||
""")
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_column('data_config', 'llm')
|
||||
# 检查列是否存在再删除
|
||||
op.execute("""
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (SELECT FROM information_schema.columns
|
||||
WHERE table_name = 'data_config' AND column_name = 'llm') THEN
|
||||
ALTER TABLE data_config DROP COLUMN llm;
|
||||
END IF;
|
||||
END $$;
|
||||
""")
|
||||
# ### end Alembic commands ###
|
||||
|
||||
@@ -20,14 +20,21 @@ depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.alter_column('data_config', 'llm_id',
|
||||
existing_type=sa.VARCHAR(),
|
||||
comment='LLM模型配置ID',
|
||||
existing_nullable=True)
|
||||
op.alter_column('data_config', 'embedding_id',
|
||||
existing_type=sa.VARCHAR(),
|
||||
comment='嵌入模型配置ID',
|
||||
existing_nullable=True)
|
||||
# 检查表和列是否存在再进行操作
|
||||
op.execute("""
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (SELECT FROM information_schema.columns
|
||||
WHERE table_name = 'data_config' AND column_name = 'llm_id') THEN
|
||||
COMMENT ON COLUMN data_config.llm_id IS 'LLM模型配置ID';
|
||||
END IF;
|
||||
|
||||
IF EXISTS (SELECT FROM information_schema.columns
|
||||
WHERE table_name = 'data_config' AND column_name = 'embedding_id') THEN
|
||||
COMMENT ON COLUMN data_config.embedding_id IS '嵌入模型配置ID';
|
||||
END IF;
|
||||
END $$;
|
||||
""")
|
||||
op.add_column('workspaces', sa.Column('storage_type', sa.String(), nullable=True))
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
@@ -20,8 +20,9 @@ depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_table('data_config_copy1')
|
||||
op.drop_table('data_config')
|
||||
# 使用 IF EXISTS 避免表不存在时报错
|
||||
op.execute('DROP TABLE IF EXISTS data_config_copy1')
|
||||
op.execute('DROP TABLE IF EXISTS data_config')
|
||||
op.add_column('agent_configs', sa.Column('model_parameters', postgresql.JSON(astext_type=sa.Text()), nullable=True, comment='模型参数配置(temperature、max_tokens等)'))
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_table('data_config')
|
||||
op.execute('DROP TABLE IF EXISTS data_config')
|
||||
op.add_column('app_releases', sa.Column('release_notes', sa.String(), nullable=True, comment='版本说明'))
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
@@ -358,8 +358,9 @@ def upgrade() -> None:
|
||||
$$ LANGUAGE plpgsql;
|
||||
""")
|
||||
|
||||
# 创建 documents 表上的触发器
|
||||
# 创建 documents 表上的触发器(如果不存在)
|
||||
op.execute("""
|
||||
DROP TRIGGER IF EXISTS tr_documents_update_stats ON documents;
|
||||
CREATE TRIGGER tr_documents_update_stats
|
||||
AFTER INSERT OR UPDATE OR DELETE ON documents
|
||||
FOR EACH ROW
|
||||
|
||||
@@ -69,8 +69,9 @@ def upgrade():
|
||||
$$ LANGUAGE plpgsql;
|
||||
""")
|
||||
|
||||
# 创建 documents 表上的触发器
|
||||
# 创建 documents 表上的触发器(如果不存在)
|
||||
op.execute("""
|
||||
DROP TRIGGER IF EXISTS tr_documents_update_stats ON documents;
|
||||
CREATE TRIGGER tr_documents_update_stats
|
||||
AFTER INSERT OR UPDATE OR DELETE ON documents
|
||||
FOR EACH ROW
|
||||
|
||||
@@ -184,5 +184,5 @@ def downgrade() -> None:
|
||||
op.drop_table('end_users')
|
||||
op.drop_index(op.f('ix_retrieval_info_id'), table_name='retrieval_info')
|
||||
op.drop_table('retrieval_info')
|
||||
op.drop_table('data_config')
|
||||
op.execute('DROP TABLE IF EXISTS data_config')
|
||||
# ### end Alembic commands ###
|
||||
|
||||
@@ -24,12 +24,22 @@ def upgrade() -> None:
|
||||
# 先删除依赖的视图(如果存在)
|
||||
op.execute("DROP VIEW IF EXISTS data_config_sorted CASCADE")
|
||||
|
||||
op.alter_column('data_config', 'llm_id',
|
||||
existing_type=sa.VARCHAR(),
|
||||
comment='LLM模型配置ID',
|
||||
existing_comment='临时',
|
||||
existing_nullable=True)
|
||||
op.drop_column('data_config', 'llm')
|
||||
# 检查表和列是否存在再进行操作
|
||||
op.execute("""
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (SELECT FROM information_schema.columns
|
||||
WHERE table_name = 'data_config' AND column_name = 'llm_id') THEN
|
||||
ALTER TABLE data_config ALTER COLUMN llm_id SET DATA TYPE VARCHAR;
|
||||
COMMENT ON COLUMN data_config.llm_id IS 'LLM模型配置ID';
|
||||
END IF;
|
||||
|
||||
IF EXISTS (SELECT FROM information_schema.columns
|
||||
WHERE table_name = 'data_config' AND column_name = 'llm') THEN
|
||||
ALTER TABLE data_config DROP COLUMN llm;
|
||||
END IF;
|
||||
END $$;
|
||||
""")
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
|
||||
@@ -20,19 +20,29 @@ depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.alter_column('data_config', 'workspace_id',
|
||||
existing_type=sa.UUID(),
|
||||
comment='工作空间ID',
|
||||
existing_comment='comment',
|
||||
existing_nullable=True)
|
||||
# 检查列是否存在再进行操作
|
||||
op.execute("""
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (SELECT FROM information_schema.columns
|
||||
WHERE table_name = 'data_config' AND column_name = 'workspace_id') THEN
|
||||
COMMENT ON COLUMN data_config.workspace_id IS '工作空间ID';
|
||||
END IF;
|
||||
END $$;
|
||||
""")
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.alter_column('data_config', 'workspace_id',
|
||||
existing_type=sa.UUID(),
|
||||
comment='comment',
|
||||
existing_comment='工作空间ID',
|
||||
existing_nullable=True)
|
||||
# 检查列是否存在再进行操作
|
||||
op.execute("""
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (SELECT FROM information_schema.columns
|
||||
WHERE table_name = 'data_config' AND column_name = 'workspace_id') THEN
|
||||
COMMENT ON COLUMN data_config.workspace_id IS 'comment';
|
||||
END IF;
|
||||
END $$;
|
||||
""")
|
||||
# ### end Alembic commands ###
|
||||
|
||||
@@ -20,8 +20,9 @@ depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_table('mappings_copy1')
|
||||
op.drop_table('mappings')
|
||||
# 使用 IF EXISTS 避免表不存在时报错
|
||||
op.execute('DROP TABLE IF EXISTS mappings_copy1')
|
||||
op.execute('DROP TABLE IF EXISTS mappings')
|
||||
op.add_column('agent_configs', sa.Column('knowledge_retrieval', postgresql.JSON(astext_type=sa.Text()), nullable=True, comment='知识库检索配置'))
|
||||
op.add_column('agent_configs', sa.Column('memory', postgresql.JSON(astext_type=sa.Text()), nullable=True, comment='记忆配置'))
|
||||
op.add_column('agent_configs', sa.Column('variables', postgresql.JSON(astext_type=sa.Text()), nullable=True, comment='变量配置'))
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
# Memory Bear 前端项目
|
||||
|
||||
基于 React + TypeScript + Vite + Ant Design 构建的知识库管理系统前端应用。
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **框架**: React 18 + TypeScript
|
||||
- **构建工具**: Vite
|
||||
- **UI 组件库**: Ant Design 5
|
||||
- **样式**: Tailwind CSS 4
|
||||
- **路由**: React Router 6
|
||||
- **状态管理**: Zustand
|
||||
- **国际化**: i18next
|
||||
- **图表**: ECharts
|
||||
- **其他**: React Markdown
|
||||
|
||||
## 环境要求
|
||||
|
||||
- Node.js >= 20.19+, 22.12+
|
||||
- npm 或 yarn
|
||||
|
||||
## 安装
|
||||
|
||||
```bash
|
||||
# 克隆项目
|
||||
git clone <repository-url>
|
||||
|
||||
# 进入项目目录
|
||||
cd memory-bear-font-end
|
||||
|
||||
# 安装依赖
|
||||
npm install
|
||||
```
|
||||
|
||||
## 运行
|
||||
|
||||
### 开发环境
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
启动后访问: `http://localhost:5173`
|
||||
|
||||
### 生产构建
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
构建产物输出到 `dist` 目录。
|
||||
|
||||
### 预览构建结果
|
||||
|
||||
```bash
|
||||
npm run preview
|
||||
```
|
||||
|
||||
## 代码检查
|
||||
|
||||
```bash
|
||||
npm run lint
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
src/
|
||||
├── api/ # API 接口
|
||||
├── assets/ # 静态资源
|
||||
├── components/ # 公共组件
|
||||
├── hooks/ # 自定义 Hooks
|
||||
├── i18n/ # 国际化配置
|
||||
├── routes/ # 路由配置
|
||||
├── store/ # 状态管理
|
||||
├── styles/ # 全局样式
|
||||
├── utils/ # 工具函数
|
||||
├── views/ # 页面视图
|
||||
├── App.tsx # 应用入口组件
|
||||
└── main.tsx # 应用入口文件
|
||||
```
|
||||
|
||||
## 配置说明
|
||||
|
||||
- 开发服务器默认监听 `0.0.0.0:5173`
|
||||
- API 代理配置在 `vite.config.ts` 中
|
||||
- 路径别名 `@` 指向 `src` 目录
|
||||
|
||||
## License
|
||||
|
||||
Private
|
||||
@@ -11,7 +11,7 @@ export default defineConfig({
|
||||
proxy: {
|
||||
// 主要API代理,支持 /api 和 /api/* 格式
|
||||
'/api': {
|
||||
target: 'http://0.0.0.0:5173', // 后端服务地址
|
||||
target: 'http://127.0.0.1:8000', // 后端服务地址
|
||||
changeOrigin: true,
|
||||
|
||||
// 匹配所有以/api开头的请求,包括/api/token
|
||||
|
||||
Reference in New Issue
Block a user